From e9787c7a9dd8bab49ae6d784f10d3619480e8abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 11 Oct 2013 02:10:02 -0400 Subject: [PATCH 01/40] libfreerdp-core: minor TS Gateway fixes --- client/common/file.c | 4 ++++ libfreerdp/core/gateway/rpc_client.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/client/common/file.c b/client/common/file.c index fecfe54c2..769108e35 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -832,6 +832,10 @@ BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* if (file->GatewayUsageMethod == TSC_PROXY_MODE_DIRECT) freerdp_set_param_bool(settings, FreeRDP_GatewayEnabled, TRUE); + else if (file->GatewayUsageMethod == TSC_PROXY_MODE_DETECT) + freerdp_set_param_bool(settings, FreeRDP_GatewayEnabled, TRUE); + else if (file->GatewayUsageMethod == TSC_PROXY_MODE_DEFAULT) + freerdp_set_param_bool(settings, FreeRDP_GatewayEnabled, TRUE); else if (file->GatewayUsageMethod == TSC_PROXY_MODE_NONE_DETECT) freerdp_set_param_bool(settings, FreeRDP_GatewayEnabled, FALSE); } diff --git a/libfreerdp/core/gateway/rpc_client.c b/libfreerdp/core/gateway/rpc_client.c index f58a7db2c..502ea9dad 100644 --- a/libfreerdp/core/gateway/rpc_client.c +++ b/libfreerdp/core/gateway/rpc_client.c @@ -161,7 +161,7 @@ int rpc_client_on_fragment_received_event(rdpRpc* rpc) if (StubLength == 4) { //fprintf(stderr, "Ignoring TsProxySendToServer Response\n"); - printf("Got stub length 4 with flags %d and callid %d\n", header->common.pfc_flags, header->common.call_id); + //printf("Got stub length 4 with flags %d and callid %d\n", header->common.pfc_flags, header->common.call_id); /* received a disconnect request from the server? */ if ((header->common.call_id == rpc->PipeCallId) && (header->common.pfc_flags & PFC_LAST_FRAG)) From bd6760bd136b85a2c44ef0145a3d9dac4a688f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 11 Oct 2013 06:12:50 -0400 Subject: [PATCH 02/40] libfreerdp-core: start implement TSG OpenSSL BIO --- include/freerdp/crypto/tls.h | 3 + libfreerdp/core/transport.c | 104 +++++++++++++++++++++++++++++++++++ libfreerdp/core/transport.h | 1 + libfreerdp/crypto/tls.c | 27 +++++++-- 4 files changed, 130 insertions(+), 5 deletions(-) diff --git a/include/freerdp/crypto/tls.h b/include/freerdp/crypto/tls.h index 7e9aca995..a18597308 100644 --- a/include/freerdp/crypto/tls.h +++ b/include/freerdp/crypto/tls.h @@ -39,9 +39,12 @@ typedef struct rdp_tls rdpTls; struct rdp_tls { SSL* ssl; + BIO* bio; + void* tsg; int sockfd; SSL_CTX* ctx; BYTE* PublicKey; + BIO_METHOD* methods; DWORD PublicKeyLength; rdpSettings* settings; SecPkgContext_Bindings* Bindings; diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index e06e92893..fb3c013d8 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -104,10 +104,114 @@ BOOL transport_connect_rdp(rdpTransport* transport) return TRUE; } +static int transport_bio_tsg_write(BIO* bio, const char* buf, int num) +{ + printf("transport_bio_tsg_write: %d\n", num); + + tsg_write((rdpTsg*) bio->ptr, (BYTE*) buf, num); + BIO_clear_retry_flags(bio); + + return num; +} + +static int transport_bio_tsg_read(BIO* bio, char* buf, int size) +{ + printf("transport_bio_tsg_read: %d\n", size); + + BIO_clear_retry_flags(bio); + + return 1; +} + +static int transport_bio_tsg_puts(BIO* bio, const char* str) +{ + printf("transport_bio_tsg_puts: %d\n", strlen(str)); + return 1; +} + +static int transport_bio_tsg_gets(BIO* bio, char* str, int size) +{ + printf("transport_bio_tsg_gets: %d\n", size); + return 1; +} + +static long transport_bio_tsg_ctrl(BIO* bio, int cmd, long arg1, void* arg2) +{ + printf("transport_bio_tsg_puts: cmd: %d arg1: %d arg2: %p\n", cmd, arg1, arg2); + return 1; +} + +static int transport_bio_tsg_new(BIO* bio) +{ + printf("transport_bio_tsg_new\n"); + + bio->init = 1; + bio->num = 0; + bio->ptr = NULL; + bio->flags = 0; + + return 1; +} + +static int transport_bio_tsg_free(BIO* bio) +{ + printf("transport_bio_tsg_free\n"); + return 1; +} + +#define BIO_TYPE_TSG 65 + +static BIO_METHOD transport_bio_tsg_methods = +{ + BIO_TYPE_TSG, + "TSGateway", + transport_bio_tsg_write, + transport_bio_tsg_read, + transport_bio_tsg_puts, + transport_bio_tsg_gets, + transport_bio_tsg_ctrl, + transport_bio_tsg_new, + transport_bio_tsg_free, + NULL, +}; + +BIO_METHOD* BIO_s_tsg(void) +{ + return &transport_bio_tsg_methods; +} + BOOL transport_connect_tls(rdpTransport* transport) { if (transport->layer == TRANSPORT_LAYER_TSG) + { + if (!transport->TlsIn) + transport->TlsIn = tls_new(transport->settings); + + if (!transport->TlsOut) + transport->TlsOut = transport->TlsIn; + + transport->TlsIn->methods = BIO_s_tsg(); + transport->TlsIn->tsg = (void*) transport->tsg; + + transport->layer = TRANSPORT_LAYER_TLS; + + if (tls_connect(transport->TlsIn) != TRUE) + { + if (!connectErrorCode) + connectErrorCode = TLSCONNECTERROR; + + tls_free(transport->TlsIn); + + if (transport->TlsIn == transport->TlsOut) + transport->TlsIn = transport->TlsOut = NULL; + else + transport->TlsIn = NULL; + + return FALSE; + } + return TRUE; + } if (transport->TlsIn == NULL) transport->TlsIn = tls_new(transport->settings); diff --git a/libfreerdp/core/transport.h b/libfreerdp/core/transport.h index bb573b6eb..821ab37fd 100644 --- a/libfreerdp/core/transport.h +++ b/libfreerdp/core/transport.h @@ -25,6 +25,7 @@ typedef enum TRANSPORT_LAYER_TCP, TRANSPORT_LAYER_TLS, TRANSPORT_LAYER_TSG, + TRANSPORT_LAYER_TSG_TLS, TRANSPORT_LAYER_CLOSED } TRANSPORT_LAYER; diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index 3e089e418..7b58645b6 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -106,7 +106,7 @@ BOOL tls_connect(rdpTls* tls) tls->ctx = SSL_CTX_new(TLSv1_client_method()); - if (tls->ctx == NULL) + if (!tls->ctx) { fprintf(stderr, "SSL_CTX_new failed\n"); return FALSE; @@ -147,16 +147,33 @@ BOOL tls_connect(rdpTls* tls) tls->ssl = SSL_new(tls->ctx); - if (tls->ssl == NULL) + if (!tls->ssl) { fprintf(stderr, "SSL_new failed\n"); return FALSE; } - if (SSL_set_fd(tls->ssl, tls->sockfd) < 1) + if (tls->tsg) { - fprintf(stderr, "SSL_set_fd failed\n"); - return FALSE; + tls->bio = BIO_new(tls->methods); + + if (!tls->bio) + { + fprintf(stderr, "BIO_new failed\n"); + return FALSE; + } + + tls->bio->ptr = tls->tsg; + + SSL_set_bio(tls->ssl, tls->bio, tls->bio); + } + else + { + if (SSL_set_fd(tls->ssl, tls->sockfd) < 1) + { + fprintf(stderr, "SSL_set_fd failed\n"); + return FALSE; + } } connection_status = SSL_connect(tls->ssl); From b5dd670e73d17132326e1088a7ab38d53d910ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 11 Oct 2013 15:27:22 -0400 Subject: [PATCH 03/40] libfreerdp-core: extend OpenSSL TSG BIO --- libfreerdp/core/transport.c | 39 ++++++++++++++++++++++++++++++++++--- libfreerdp/crypto/tls.c | 12 ++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index fb3c013d8..862489c0d 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -104,23 +104,56 @@ BOOL transport_connect_rdp(rdpTransport* transport) return TRUE; } +long transport_bio_tsg_callback(BIO* bio, int mode, const char* argp, int argi, long argl, long ret) +{ + printf("transport_bio_tsg_callback: mode: %d argp: %p argi: %d argl: %d ret: %d\n", + mode, argp, argi, argl, ret); + + return 1; +} + static int transport_bio_tsg_write(BIO* bio, const char* buf, int num) { + int status; + rdpTsg* tsg; + printf("transport_bio_tsg_write: %d\n", num); - tsg_write((rdpTsg*) bio->ptr, (BYTE*) buf, num); + tsg = (rdpTsg*) bio->ptr; + status = tsg_write(tsg, (BYTE*) buf, num); + + printf("tsg_write: %d\n", status); + BIO_clear_retry_flags(bio); + if (status <= 0) + { + BIO_set_retry_write(bio); + } + return num; } static int transport_bio_tsg_read(BIO* bio, char* buf, int size) { + int status; + rdpTsg* tsg; + printf("transport_bio_tsg_read: %d\n", size); + tsg = (rdpTsg*) bio->ptr; + status = tsg_read(bio->ptr, (BYTE*) buf, size); + + printf("tsg_read: %d\n", status); + BIO_clear_retry_flags(bio); - return 1; + if (status <= 0) + { + BIO_set_retry_read(bio); + } + + return status; } static int transport_bio_tsg_puts(BIO* bio, const char* str) @@ -137,7 +170,7 @@ static int transport_bio_tsg_gets(BIO* bio, char* str, int size) static long transport_bio_tsg_ctrl(BIO* bio, int cmd, long arg1, void* arg2) { - printf("transport_bio_tsg_puts: cmd: %d arg1: %d arg2: %p\n", cmd, arg1, arg2); + printf("transport_bio_tsg_ctrl: cmd: %d arg1: %d arg2: %p\n", cmd, arg1, arg2); return 1; } diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index 7b58645b6..e5d20c61d 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -97,6 +97,16 @@ SecPkgContext_Bindings* tls_get_channel_bindings(X509* cert) return ContextBindings; } +static void tls_ssl_info_callback(const SSL* ssl, int type, int val) +{ + printf("tls_ssl_info_callback: type: %d val: %d\n"); + + if (type & SSL_CB_HANDSHAKE_START) + { + + } +} + BOOL tls_connect(rdpTls* tls) { CryptoCert cert; @@ -166,6 +176,8 @@ BOOL tls_connect(rdpTls* tls) tls->bio->ptr = tls->tsg; SSL_set_bio(tls->ssl, tls->bio, tls->bio); + + SSL_CTX_set_info_callback(tls->ctx, tls_ssl_info_callback); } else { From eb25e45149c640a4dd650c28e4008c562ca736df Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Thu, 24 Oct 2013 12:13:41 -0600 Subject: [PATCH 04/40] TLS over TLS maybe working. --- libfreerdp/core/connection.c | 4 ++-- libfreerdp/core/gateway/rpc.c | 2 ++ libfreerdp/core/gateway/rpc_client.c | 2 ++ libfreerdp/core/transport.c | 30 ++++++++++++++-------------- libfreerdp/core/transport.h | 1 + 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 2e2de425f..36aa0234d 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -211,11 +211,11 @@ BOOL rdp_client_connect(rdpRdp* rdp) free(cookie); settings->RdpSecurity = TRUE; - settings->TlsSecurity = FALSE; +/* settings->TlsSecurity = FALSE; */ settings->NlaSecurity = FALSE; settings->ExtSecurity = FALSE; - //settings->TlsSecurity = TRUE; + settings->TlsSecurity = TRUE; //settings->NlaSecurity = TRUE; } else diff --git a/libfreerdp/core/gateway/rpc.c b/libfreerdp/core/gateway/rpc.c index ae024cd9e..43485df84 100644 --- a/libfreerdp/core/gateway/rpc.c +++ b/libfreerdp/core/gateway/rpc.c @@ -335,10 +335,12 @@ int rpc_in_write(rdpRpc* rpc, BYTE* data, int length) int status; #ifdef WITH_DEBUG_TSG + /* fprintf(stderr, "Sending PDU (length: %d)\n", length); rpc_pdu_header_print((rpcconn_hdr_t*) data); winpr_HexDump(data, length); fprintf(stderr, "\n"); + */ #endif status = tls_write_all(rpc->TlsIn, data, length); diff --git a/libfreerdp/core/gateway/rpc_client.c b/libfreerdp/core/gateway/rpc_client.c index 502ea9dad..b9ce57122 100644 --- a/libfreerdp/core/gateway/rpc_client.c +++ b/libfreerdp/core/gateway/rpc_client.c @@ -432,12 +432,14 @@ RPC_PDU* rpc_recv_dequeue_pdu(rdpRpc* rpc) pdu = (RPC_PDU*) Queue_Dequeue(rpc->client->ReceiveQueue); #ifdef WITH_DEBUG_TSG + /* if (pdu) { fprintf(stderr, "Receiving PDU (length: %d, CallId: %d)\n", pdu->s->length, pdu->CallId); winpr_HexDump(Stream_Buffer(pdu->s), Stream_Length(pdu->s)); fprintf(stderr, "\n"); } + */ #endif return pdu; diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 862489c0d..079f989c0 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -171,7 +171,10 @@ static int transport_bio_tsg_gets(BIO* bio, char* str, int size) static long transport_bio_tsg_ctrl(BIO* bio, int cmd, long arg1, void* arg2) { printf("transport_bio_tsg_ctrl: cmd: %d arg1: %d arg2: %p\n", cmd, arg1, arg2); - return 1; + if(cmd == BIO_CTRL_FLUSH) { + return 1; + } + return 0; } static int transport_bio_tsg_new(BIO* bio) @@ -217,28 +220,21 @@ BOOL transport_connect_tls(rdpTransport* transport) { if (transport->layer == TRANSPORT_LAYER_TSG) { - if (!transport->TlsIn) - transport->TlsIn = tls_new(transport->settings); + transport->TsgTls = tls_new(transport->settings); - if (!transport->TlsOut) - transport->TlsOut = transport->TlsIn; + transport->TsgTls->methods = BIO_s_tsg(); + transport->TsgTls->tsg = (void*) transport->tsg; - transport->TlsIn->methods = BIO_s_tsg(); - transport->TlsIn->tsg = (void*) transport->tsg; + transport->layer = TRANSPORT_LAYER_TSG_TLS; - transport->layer = TRANSPORT_LAYER_TLS; - - if (tls_connect(transport->TlsIn) != TRUE) + if (tls_connect(transport->TsgTls) != TRUE) { if (!connectErrorCode) connectErrorCode = TLSCONNECTERROR; - tls_free(transport->TlsIn); + tls_free(transport->TsgTls); - if (transport->TlsIn == transport->TlsOut) - transport->TlsIn = transport->TlsOut = NULL; - else - transport->TlsIn = NULL; + transport->TsgTls = NULL; return FALSE; } @@ -522,6 +518,8 @@ int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) status = tcp_read(transport->TcpIn, data + read, bytes - read); else if (transport->layer == TRANSPORT_LAYER_TSG) status = tsg_read(transport->tsg, data + read, bytes - read); + else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) + status = tls_read(transport->TsgTls, data + read, bytes - read); /* blocking means that we can't continue until this is read */ @@ -677,6 +675,8 @@ int transport_write(rdpTransport* transport, wStream* s) status = tcp_write(transport->TcpOut, Stream_Pointer(s), length); else if (transport->layer == TRANSPORT_LAYER_TSG) status = tsg_write(transport->tsg, Stream_Pointer(s), length); + else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) + status = tls_write(transport->TsgTls, Stream_Pointer(s), length); if (status < 0) break; /* error occurred */ diff --git a/libfreerdp/core/transport.h b/libfreerdp/core/transport.h index 821ab37fd..235e5b3e5 100644 --- a/libfreerdp/core/transport.h +++ b/libfreerdp/core/transport.h @@ -58,6 +58,7 @@ struct rdp_transport rdpTcp* TcpOut; rdpTls* TlsIn; rdpTls* TlsOut; + rdpTls* TsgTls; rdpCredssp* credssp; rdpSettings* settings; UINT32 SleepInterval; From db890d9bf2c52402173b89a59360e69df3a9c053 Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Thu, 24 Oct 2013 12:31:28 -0600 Subject: [PATCH 05/40] TLS over TLS baseline functionality. TLS over TLS works and we get screen drawing and server interaction. Network traffic flows in spurts with frequent apparent hangups. --- libfreerdp/core/connection.c | 4 +--- libfreerdp/core/transport.c | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 36aa0234d..2c3be5c9b 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -211,12 +211,10 @@ BOOL rdp_client_connect(rdpRdp* rdp) free(cookie); settings->RdpSecurity = TRUE; -/* settings->TlsSecurity = FALSE; */ + settings->TlsSecurity = TRUE; settings->NlaSecurity = FALSE; settings->ExtSecurity = FALSE; - settings->TlsSecurity = TRUE; - //settings->NlaSecurity = TRUE; } else { diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 079f989c0..375b57013 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -106,8 +106,8 @@ BOOL transport_connect_rdp(rdpTransport* transport) long transport_bio_tsg_callback(BIO* bio, int mode, const char* argp, int argi, long argl, long ret) { - printf("transport_bio_tsg_callback: mode: %d argp: %p argi: %d argl: %d ret: %d\n", - mode, argp, argi, argl, ret); +/* printf("transport_bio_tsg_callback: mode: %d argp: %p argi: %d argl: %d ret: %d\n", */ +/* mode, argp, argi, argl, ret); */ return 1; } @@ -117,12 +117,12 @@ static int transport_bio_tsg_write(BIO* bio, const char* buf, int num) int status; rdpTsg* tsg; - printf("transport_bio_tsg_write: %d\n", num); +/* printf("transport_bio_tsg_write: %d\n", num); */ tsg = (rdpTsg*) bio->ptr; status = tsg_write(tsg, (BYTE*) buf, num); - printf("tsg_write: %d\n", status); +/* printf("tsg_write: %d\n", status); */ BIO_clear_retry_flags(bio); @@ -139,12 +139,12 @@ static int transport_bio_tsg_read(BIO* bio, char* buf, int size) int status; rdpTsg* tsg; - printf("transport_bio_tsg_read: %d\n", size); +/* printf("transport_bio_tsg_read: %d\n", size); */ tsg = (rdpTsg*) bio->ptr; status = tsg_read(bio->ptr, (BYTE*) buf, size); - printf("tsg_read: %d\n", status); +/* printf("tsg_read: %d\n", status); */ BIO_clear_retry_flags(bio); @@ -158,19 +158,19 @@ static int transport_bio_tsg_read(BIO* bio, char* buf, int size) static int transport_bio_tsg_puts(BIO* bio, const char* str) { - printf("transport_bio_tsg_puts: %d\n", strlen(str)); +/* printf("transport_bio_tsg_puts: %d\n", strlen(str)); */ return 1; } static int transport_bio_tsg_gets(BIO* bio, char* str, int size) { - printf("transport_bio_tsg_gets: %d\n", size); +/* printf("transport_bio_tsg_gets: %d\n", size); */ return 1; } static long transport_bio_tsg_ctrl(BIO* bio, int cmd, long arg1, void* arg2) { - printf("transport_bio_tsg_ctrl: cmd: %d arg1: %d arg2: %p\n", cmd, arg1, arg2); +/* printf("transport_bio_tsg_ctrl: cmd: %d arg1: %d arg2: %p\n", cmd, arg1, arg2); */ if(cmd == BIO_CTRL_FLUSH) { return 1; } @@ -179,7 +179,7 @@ static long transport_bio_tsg_ctrl(BIO* bio, int cmd, long arg1, void* arg2) static int transport_bio_tsg_new(BIO* bio) { - printf("transport_bio_tsg_new\n"); +/* printf("transport_bio_tsg_new\n"); */ bio->init = 1; bio->num = 0; @@ -191,7 +191,7 @@ static int transport_bio_tsg_new(BIO* bio) static int transport_bio_tsg_free(BIO* bio) { - printf("transport_bio_tsg_free\n"); +/* printf("transport_bio_tsg_free\n"); */ return 1; } From 89d45690c6f97a2b290a30a098c392561284febb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 25 Oct 2013 10:48:37 -0400 Subject: [PATCH 06/40] libwinpr-synch: don't use timed waits on OS X until they are properly ported --- winpr/libwinpr/synch/wait.c | 56 ++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/winpr/libwinpr/synch/wait.c b/winpr/libwinpr/synch/wait.c index 9c57bc4d8..47ca366c2 100644 --- a/winpr/libwinpr/synch/wait.c +++ b/winpr/libwinpr/synch/wait.c @@ -30,6 +30,7 @@ #include #include +#include #include "synch.h" #include "../thread/thread.h" @@ -114,29 +115,30 @@ static int pthread_timedjoin_np(pthread_t td, void **res, return ETIMEDOUT; } -static int pthread_mutex_timedlock(pthread_mutex_t *mutex, - const struct timespec *timeout) +static int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *timeout) { - struct timeval timenow; - struct timespec sleepytime; - int retcode; - - /* This is just to avoid a completely busy wait */ - sleepytime.tv_sec = 0; - sleepytime.tv_nsec = 10000000; /* 10ms */ - - while ((retcode = pthread_mutex_trylock (mutex)) == EBUSY) { - gettimeofday (&timenow, NULL); - - if (timenow.tv_sec >= timeout->tv_sec && - (timenow.tv_usec * 1000) >= timeout->tv_nsec) { - return ETIMEDOUT; - } - - nanosleep (&sleepytime, NULL); - } - - return retcode; + struct timeval timenow; + struct timespec sleepytime; + int retcode; + + /* This is just to avoid a completely busy wait */ + sleepytime.tv_sec = 0; + sleepytime.tv_nsec = 10000000; /* 10ms */ + + while ((retcode = pthread_mutex_trylock (mutex)) == EBUSY) + { + gettimeofday (&timenow, NULL); + + if (timenow.tv_sec >= timeout->tv_sec && + (timenow.tv_usec * 1000) >= timeout->tv_nsec) + { + return ETIMEDOUT; + } + + nanosleep (&sleepytime, NULL); + } + + return retcode; } #endif @@ -170,6 +172,7 @@ DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) if (thread->started) { +#ifdef __linux__ if (dwMilliseconds != INFINITE) { struct timespec timeout; @@ -183,10 +186,12 @@ DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) ts_add_ms(&timeout, dwMilliseconds); status = pthread_timedjoin_np(thread->thread, &thread_status, &timeout); + if (ETIMEDOUT == status) return WAIT_TIMEOUT; } else +#endif status = pthread_join(thread->thread, &thread_status); if (status != 0) @@ -214,26 +219,27 @@ DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) } else if (Type == HANDLE_TYPE_MUTEX) { - int status; WINPR_MUTEX* mutex; mutex = (WINPR_MUTEX*) Object; +#ifdef __linux__ if (dwMilliseconds != INFINITE) { + int status; struct timespec timeout; clock_gettime(CLOCK_REALTIME, &timeout); ts_add_ms(&timeout, dwMilliseconds); status = pthread_mutex_timedlock(&mutex->mutex, &timeout); + if (ETIMEDOUT == status) return WAIT_TIMEOUT; } else - { +#endif pthread_mutex_lock(&mutex->mutex); - } } else if (Type == HANDLE_TYPE_EVENT) { From f13c8a0be70ed1a0d7f27f2ce4ec497e64682945 Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Fri, 25 Oct 2013 10:43:21 -0600 Subject: [PATCH 07/40] Logging --- include/freerdp/crypto/tls.h | 1 + libfreerdp/core/transport.c | 65 +++++++++++++++++++++++++++++++----- libfreerdp/crypto/tls.c | 12 ++++++- lwd.h | 22 ++++++++++++ 4 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 lwd.h diff --git a/include/freerdp/crypto/tls.h b/include/freerdp/crypto/tls.h index a18597308..c65af3529 100644 --- a/include/freerdp/crypto/tls.h +++ b/include/freerdp/crypto/tls.h @@ -49,6 +49,7 @@ struct rdp_tls rdpSettings* settings; SecPkgContext_Bindings* Bindings; rdpCertificateStore* certificate_store; + char desc[20]; }; FREERDP_API BOOL tls_connect(rdpTls* tls); diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 375b57013..c8eb3cc18 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -49,6 +49,8 @@ #define BUFFER_SIZE 16384 +#include "lwd.h" + static void* transport_client_thread(void* arg); wStream* transport_send_stream_init(rdpTransport* transport, int size) @@ -221,6 +223,7 @@ BOOL transport_connect_tls(rdpTransport* transport) if (transport->layer == TRANSPORT_LAYER_TSG) { transport->TsgTls = tls_new(transport->settings); + sprintf(transport->TsgTls->desc, "TsgTls"); transport->TsgTls->methods = BIO_s_tsg(); transport->TsgTls->tsg = (void*) transport->tsg; @@ -242,8 +245,10 @@ BOOL transport_connect_tls(rdpTransport* transport) return TRUE; } - if (transport->TlsIn == NULL) + if (transport->TlsIn == NULL) { transport->TlsIn = tls_new(transport->settings); + sprintf(transport->TlsIn->desc, "TlsIn"); + } if (transport->TlsOut == NULL) transport->TlsOut = transport->TlsIn; @@ -317,13 +322,17 @@ BOOL transport_tsg_connect(rdpTransport* transport, const char* hostname, UINT16 transport->tsg = tsg; transport->SplitInputOutput = TRUE; - if (transport->TlsIn == NULL) + if (transport->TlsIn == NULL) { transport->TlsIn = tls_new(transport->settings); + sprintf(transport->TlsIn->desc, "TlsIn"); + } transport->TlsIn->sockfd = transport->TcpIn->sockfd; - if (transport->TlsOut == NULL) + if (transport->TlsOut == NULL) { transport->TlsOut = tls_new(transport->settings); + sprintf(transport->TlsOut->desc, "TlsOut"); + } transport->TlsOut->sockfd = transport->TcpOut->sockfd; @@ -387,8 +396,10 @@ BOOL transport_accept_rdp(rdpTransport* transport) BOOL transport_accept_tls(rdpTransport* transport) { - if (transport->TlsIn == NULL) + if (transport->TlsIn == NULL) { transport->TlsIn = tls_new(transport->settings); + sprintf(transport->TlsIn->desc, "TlsIn"); + } if (transport->TlsOut == NULL) transport->TlsOut = transport->TlsIn; @@ -410,8 +421,10 @@ BOOL transport_accept_nla(rdpTransport* transport) if (transport->TlsIn == NULL) transport->TlsIn = tls_new(transport->settings); - if (transport->TlsOut == NULL) + if (transport->TlsOut == NULL) { transport->TlsOut = transport->TlsIn; + sprintf(transport->TlsIn->desc, "TlsIn"); + } transport->layer = TRANSPORT_LAYER_TLS; transport->TlsIn->sockfd = transport->TcpIn->sockfd; @@ -509,9 +522,21 @@ int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) { int read = 0; int status = -1; + char *layer = "UNKNOWN"; + + if (transport->layer == TRANSPORT_LAYER_TLS) + layer = "TLS"; + else if (transport->layer == TRANSPORT_LAYER_TCP) + layer = "TCP"; + else if (transport->layer == TRANSPORT_LAYER_TSG) + layer = "TSG"; + else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) + layer = "TSG_TLS"; while (read < bytes) { + LWD("layer %s bytes %d read %d", layer, bytes, read); + if (transport->layer == TRANSPORT_LAYER_TLS) status = tls_read(transport->TlsIn, data + read, bytes - read); else if (transport->layer == TRANSPORT_LAYER_TCP) @@ -523,11 +548,15 @@ int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) /* blocking means that we can't continue until this is read */ - if (!transport->blocking) + if (!transport->blocking) { + LWD("layer %s return %d not blocking", layer, status); return status; + } - if (status < 0) + if (status < 0) { + LWD("layer %s return %d negative status", layer, status); return status; + } read += status; @@ -541,6 +570,7 @@ int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) } } + LWD("layer %s return %d normal", layer, status); return read; } @@ -653,6 +683,7 @@ int transport_write(rdpTransport* transport, wStream* s) { int length; int status = -1; + char *layer = "UNKNOWN"; WaitForSingleObject(transport->WriteMutex, INFINITE); @@ -667,8 +698,19 @@ int transport_write(rdpTransport* transport, wStream* s) } #endif + if (transport->layer == TRANSPORT_LAYER_TLS) + layer = "TLS"; + else if (transport->layer == TRANSPORT_LAYER_TCP) + layer = "TCP"; + else if (transport->layer == TRANSPORT_LAYER_TSG) + layer = "TSG"; + else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) + layer = "TSG_TLS"; + while (length > 0) { + LWD("layer %s length %d", layer, length); + if (transport->layer == TRANSPORT_LAYER_TLS) status = tls_write(transport->TlsOut, Stream_Pointer(s), length); else if (transport->layer == TRANSPORT_LAYER_TCP) @@ -678,11 +720,15 @@ int transport_write(rdpTransport* transport, wStream* s) else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) status = tls_write(transport->TsgTls, Stream_Pointer(s), length); - if (status < 0) + if (status < 0) { + LWD("layer %s length %d break %d negative status", + layer, length, status); break; /* error occurred */ + } if (status == 0) { + LWD("layer %s status 0", layer); /* when sending is blocked in nonblocking mode, the receiving buffer should be checked */ if (!transport->blocking) { @@ -695,6 +741,8 @@ int transport_write(rdpTransport* transport, wStream* s) tls_wait_write(transport->TlsOut); else if (transport->layer == TRANSPORT_LAYER_TCP) tcp_wait_write(transport->TcpOut); + else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) + tls_wait_write(transport->TsgTls); else USleep(transport->SleepInterval); } @@ -714,6 +762,7 @@ int transport_write(rdpTransport* transport, wStream* s) ReleaseMutex(transport->WriteMutex); + LWD("layer %s return %d", layer, status); return status; } diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index e5d20c61d..031ef12f5 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -31,6 +31,8 @@ #include +#include + static CryptoCert tls_get_certificate(rdpTls* tls, BOOL peer) { CryptoCert cert; @@ -99,7 +101,7 @@ SecPkgContext_Bindings* tls_get_channel_bindings(X509* cert) static void tls_ssl_info_callback(const SSL* ssl, int type, int val) { - printf("tls_ssl_info_callback: type: %d val: %d\n"); +/* printf("tls_ssl_info_callback: type: %d val: %d\n", type, val); */ if (type & SSL_CB_HANDSHAKE_START) { @@ -373,6 +375,8 @@ int tls_read(rdpTls* tls, BYTE* data, int length) int error; int status; + LWD("length %d", length); + status = SSL_read(tls->ssl, data, length); if (status <= 0) @@ -411,6 +415,8 @@ int tls_read(rdpTls* tls, BYTE* data, int length) } } + LWD("ret %d", status); + return status; } @@ -434,6 +440,8 @@ int tls_write(rdpTls* tls, BYTE* data, int length) int error; int status; + LWD("length %d", length); + status = SSL_write(tls->ssl, data, length); if (status <= 0) @@ -471,6 +479,8 @@ int tls_write(rdpTls* tls, BYTE* data, int length) } } + LWD("ret %d", status); + return status; } diff --git a/lwd.h b/lwd.h new file mode 100644 index 000000000..16fdb84de --- /dev/null +++ b/lwd.h @@ -0,0 +1,22 @@ + +#ifndef __LWD_H__ +#define __LWD_H__ + +#include +#include +#include + +#define LWD(fmt, ...) do { \ + time_t tod = time(NULL); \ + char buf[25]; \ + struct tm* tm_info = localtime(&tod); \ + strftime(buf, 25, "%Y:%m:%d %H:%M:%S", tm_info); \ + fprintf(stderr, "%s [%s] ", __FUNCTION__, buf); \ + fprintf(stderr, fmt, ## __VA_ARGS__); \ + fprintf(stderr, "\n"); \ + fflush(stderr); \ + } while( 0 ) + + + +#endif From cefcac34146f88f8f6d54ace864abc6034c7385b Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Fri, 25 Oct 2013 15:29:46 -0600 Subject: [PATCH 08/40] more debug --- client/X11/cli/xfreerdp.c | 2 ++ libfreerdp/core/gateway/rpc.c | 20 ++++++++++++++++++ libfreerdp/core/transport.c | 38 ++++++++++++++++++++++++++++++----- libfreerdp/crypto/tls.c | 8 ++++---- lwd.h | 7 +++---- 5 files changed, 62 insertions(+), 13 deletions(-) diff --git a/client/X11/cli/xfreerdp.c b/client/X11/cli/xfreerdp.c index 8e39158c2..dcaf5dbfd 100644 --- a/client/X11/cli/xfreerdp.c +++ b/client/X11/cli/xfreerdp.c @@ -42,6 +42,8 @@ int main(int argc, char* argv[]) rdpSettings* settings; RDP_CLIENT_ENTRY_POINTS clientEntryPoints; + setvbuf(stderr, NULL, _IONBF, 0); + ZeroMemory(&clientEntryPoints, sizeof(RDP_CLIENT_ENTRY_POINTS)); clientEntryPoints.Size = sizeof(RDP_CLIENT_ENTRY_POINTS); clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION; diff --git a/libfreerdp/core/gateway/rpc.c b/libfreerdp/core/gateway/rpc.c index 43485df84..56fa9489d 100644 --- a/libfreerdp/core/gateway/rpc.c +++ b/libfreerdp/core/gateway/rpc.c @@ -43,6 +43,8 @@ #include "rpc.h" +#include "lwd.h" + /* Security Verification Trailer Signature */ rpc_sec_verification_trailer RPC_SEC_VERIFICATION_TRAILER = @@ -316,8 +318,12 @@ int rpc_out_read(rdpRpc* rpc, BYTE* data, int length) { int status; + LWD("len %d", length); + status = tls_read(rpc->TlsOut, data, length); + LWD("status %d", status); + return status; } @@ -325,8 +331,12 @@ int rpc_out_write(rdpRpc* rpc, BYTE* data, int length) { int status; + LWD("len %d", length); + status = tls_write_all(rpc->TlsOut, data, length); + LWD("status %d", status); + return status; } @@ -342,9 +352,13 @@ int rpc_in_write(rdpRpc* rpc, BYTE* data, int length) fprintf(stderr, "\n"); */ #endif + + LWD("len %d", length); status = tls_write_all(rpc->TlsIn, data, length); + LWD("status %d", status); + return status; } @@ -362,9 +376,12 @@ int rpc_write(rdpRpc* rpc, BYTE* data, int length, UINT16 opnum) ntlm = rpc->ntlm; + LWD("len %d", length); + if (ntlm->table->QueryContextAttributes(&ntlm->context, SECPKG_ATTR_SIZES, &ntlm->ContextSizes) != SEC_E_OK) { fprintf(stderr, "QueryContextAttributes SECPKG_ATTR_SIZES failure\n"); + LWD("status -1 query context"); return -1; } @@ -436,6 +453,7 @@ int rpc_write(rdpRpc* rpc, BYTE* data, int length, UINT16 opnum) { fprintf(stderr, "EncryptMessage status: 0x%08X\n", encrypt_status); free(request_pdu); + LWD("status -1 encrypt_status fail"); return -1; } @@ -446,6 +464,8 @@ int rpc_write(rdpRpc* rpc, BYTE* data, int length, UINT16 opnum) rpc_send_enqueue_pdu(rpc, buffer, request_pdu->frag_length); free(request_pdu); + LWD("status %d", length); + return length; } diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index c8eb3cc18..d8976bf87 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -223,6 +223,7 @@ BOOL transport_connect_tls(rdpTransport* transport) if (transport->layer == TRANSPORT_LAYER_TSG) { transport->TsgTls = tls_new(transport->settings); + LWD("create TsgTls"); sprintf(transport->TsgTls->desc, "TsgTls"); transport->TsgTls->methods = BIO_s_tsg(); @@ -247,6 +248,7 @@ BOOL transport_connect_tls(rdpTransport* transport) if (transport->TlsIn == NULL) { transport->TlsIn = tls_new(transport->settings); + LWD("create TlsIn"); sprintf(transport->TlsIn->desc, "TlsIn"); } @@ -324,6 +326,7 @@ BOOL transport_tsg_connect(rdpTransport* transport, const char* hostname, UINT16 if (transport->TlsIn == NULL) { transport->TlsIn = tls_new(transport->settings); + LWD("create TlsIn"); sprintf(transport->TlsIn->desc, "TlsIn"); } @@ -331,6 +334,7 @@ BOOL transport_tsg_connect(rdpTransport* transport, const char* hostname, UINT16 if (transport->TlsOut == NULL) { transport->TlsOut = tls_new(transport->settings); + LWD("create TlsOut"); sprintf(transport->TlsOut->desc, "TlsOut"); } @@ -398,6 +402,7 @@ BOOL transport_accept_tls(rdpTransport* transport) { if (transport->TlsIn == NULL) { transport->TlsIn = tls_new(transport->settings); + LWD("create TlsIn"); sprintf(transport->TlsIn->desc, "TlsIn"); } @@ -418,13 +423,14 @@ BOOL transport_accept_nla(rdpTransport* transport) freerdp* instance; rdpSettings* settings; - if (transport->TlsIn == NULL) + if (transport->TlsIn == NULL) { transport->TlsIn = tls_new(transport->settings); - - if (transport->TlsOut == NULL) { - transport->TlsOut = transport->TlsIn; + LWD("create TlsIn"); sprintf(transport->TlsIn->desc, "TlsIn"); } + + if (transport->TlsOut == NULL) + transport->TlsOut = transport->TlsIn; transport->layer = TRANSPORT_LAYER_TLS; transport->TlsIn->sockfd = transport->TcpIn->sockfd; @@ -518,6 +524,24 @@ UINT32 nla_header_length(wStream* s) return length; } +char *want(rdpTls *tls) +{ + int what = SSL_want(tls->ssl); + switch(what) + { + case SSL_NOTHING: + return "NOTHING"; + case SSL_WRITING: + return "WRITING"; + case SSL_READING: + return "READING"; + case SSL_X509_LOOKUP: + return "X509_LOOKUP"; + default: + return "UNKNOWN"; + } +} + int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) { int read = 0; @@ -543,8 +567,12 @@ int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) status = tcp_read(transport->TcpIn, data + read, bytes - read); else if (transport->layer == TRANSPORT_LAYER_TSG) status = tsg_read(transport->tsg, data + read, bytes - read); - else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) + else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) { + LWD("TlsIn SSL pending %d want %s", SSL_pending(transport->TlsIn->ssl), want(transport->TlsIn)); + LWD("TlsOut SSL pending %d want %s", SSL_pending(transport->TlsOut->ssl), want(transport->TlsOut)); + LWD("TsgTls SSL pending %d want %s", SSL_pending(transport->TsgTls->ssl), want(transport->TsgTls)); status = tls_read(transport->TsgTls, data + read, bytes - read); + } /* blocking means that we can't continue until this is read */ diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index 031ef12f5..d2d8d7d1d 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -375,7 +375,7 @@ int tls_read(rdpTls* tls, BYTE* data, int length) int error; int status; - LWD("length %d", length); + LWD("tls %s length %d", tls->desc, length); status = SSL_read(tls->ssl, data, length); @@ -415,7 +415,7 @@ int tls_read(rdpTls* tls, BYTE* data, int length) } } - LWD("ret %d", status); + LWD("tls %s ret %d", tls->desc, status); return status; } @@ -440,7 +440,7 @@ int tls_write(rdpTls* tls, BYTE* data, int length) int error; int status; - LWD("length %d", length); + LWD("tls %s length %d", tls->desc, length); status = SSL_write(tls->ssl, data, length); @@ -479,7 +479,7 @@ int tls_write(rdpTls* tls, BYTE* data, int length) } } - LWD("ret %d", status); + LWD("tls %s ret %d", tls->desc, status); return status; } diff --git a/lwd.h b/lwd.h index 16fdb84de..c62eb07f0 100644 --- a/lwd.h +++ b/lwd.h @@ -10,13 +10,12 @@ time_t tod = time(NULL); \ char buf[25]; \ struct tm* tm_info = localtime(&tod); \ - strftime(buf, 25, "%Y:%m:%d %H:%M:%S", tm_info); \ - fprintf(stderr, "%s [%s] ", __FUNCTION__, buf); \ + strftime(buf, 25, "%H:%M:%S", tm_info); \ + fprintf(stderr, "%20.20s [%s] ", __FUNCTION__, buf); \ fprintf(stderr, fmt, ## __VA_ARGS__); \ fprintf(stderr, "\n"); \ - fflush(stderr); \ } while( 0 ) - +// fflush(stderr); #endif From 426dc2cf840593a23b6e7169ee4cea101ae28dd2 Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Fri, 25 Oct 2013 17:17:36 -0600 Subject: [PATCH 09/40] fix blocking issues. Full TLS over TLS. --- libfreerdp/core/transport.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index d8976bf87..1554cdd98 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -79,7 +79,7 @@ BOOL transport_disconnect(rdpTransport* transport) if (transport->layer == TRANSPORT_LAYER_TLS) status &= tls_disconnect(transport->TlsIn); - if (transport->layer == TRANSPORT_LAYER_TSG) + if (transport->layer == TRANSPORT_LAYER_TSG || transport->layer == TRANSPORT_LAYER_TSG_TLS) { tsg_disconnect(transport->tsg); } @@ -119,11 +119,15 @@ static int transport_bio_tsg_write(BIO* bio, const char* buf, int num) int status; rdpTsg* tsg; + LWD("len %d", num); + /* printf("transport_bio_tsg_write: %d\n", num); */ tsg = (rdpTsg*) bio->ptr; status = tsg_write(tsg, (BYTE*) buf, num); + LWD("status %d", status); + /* printf("tsg_write: %d\n", status); */ BIO_clear_retry_flags(bio); @@ -141,11 +145,15 @@ static int transport_bio_tsg_read(BIO* bio, char* buf, int size) int status; rdpTsg* tsg; + LWD("len %d", size); + /* printf("transport_bio_tsg_read: %d\n", size); */ tsg = (rdpTsg*) bio->ptr; status = tsg_read(bio->ptr, (BYTE*) buf, size); + LWD("status %d", status); + /* printf("tsg_read: %d\n", status); */ BIO_clear_retry_flags(bio); @@ -155,7 +163,7 @@ static int transport_bio_tsg_read(BIO* bio, char* buf, int size) BIO_set_retry_read(bio); } - return status; + return status > 0 ? status : -1; } static int transport_bio_tsg_puts(BIO* bio, const char* str) @@ -281,7 +289,7 @@ BOOL transport_connect_nla(rdpTransport* transport) freerdp* instance; rdpSettings* settings; - if (transport->layer == TRANSPORT_LAYER_TSG) + if (transport->layer == TRANSPORT_LAYER_TSG || transport->layer == TRANSPORT_LAYER_TSG_TLS) return TRUE; if (!transport_connect_tls(transport)) @@ -568,9 +576,11 @@ int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) else if (transport->layer == TRANSPORT_LAYER_TSG) status = tsg_read(transport->tsg, data + read, bytes - read); else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) { + /* LWD("TlsIn SSL pending %d want %s", SSL_pending(transport->TlsIn->ssl), want(transport->TlsIn)); LWD("TlsOut SSL pending %d want %s", SSL_pending(transport->TlsOut->ssl), want(transport->TlsOut)); - LWD("TsgTls SSL pending %d want %s", SSL_pending(transport->TsgTls->ssl), want(transport->TsgTls)); + LWD("TsgTls SSL pending %d want %s", SSL_pending(transport->TsgTls->ssl), want(transport->TlsIn)); + */ status = tls_read(transport->TsgTls, data + read, bytes - read); } @@ -998,7 +1008,7 @@ BOOL transport_set_blocking_mode(rdpTransport* transport, BOOL blocking) status &= tcp_set_blocking_mode(transport->TcpIn, blocking); } - if (transport->layer == TRANSPORT_LAYER_TSG) + if (transport->layer == TRANSPORT_LAYER_TSG || transport->layer == TRANSPORT_LAYER_TSG_TLS) { tsg_set_blocking_mode(transport->tsg, blocking); } From 48a2235e9e7d2296710801d8e6f86f087535b2c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 28 Oct 2013 16:25:37 -0400 Subject: [PATCH 10/40] mfreerdp-server: fix compilation issue --- server/Mac/mf_peer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/Mac/mf_peer.h b/server/Mac/mf_peer.h index 0f8096ab2..5c3f71572 100644 --- a/server/Mac/mf_peer.h +++ b/server/Mac/mf_peer.h @@ -27,7 +27,7 @@ BOOL mf_peer_check_fds(freerdp_peer* client); void mf_peer_rfx_update(freerdp_peer* client); -void mf_peer_context_new(freerdp_peer* client, mfPeerContext* context); +int mf_peer_context_new(freerdp_peer* client, mfPeerContext* context); void mf_peer_context_free(freerdp_peer* client, mfPeerContext* context); void mf_peer_init(freerdp_peer* client); From c025042d075d283a3177310640578d09515ca418 Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Mon, 28 Oct 2013 14:39:10 -0600 Subject: [PATCH 11/40] NLA over TLS support Improve credssp transport layer handling, so that it works with the correct TLS object. --- libfreerdp/core/connection.c | 3 +++ libfreerdp/core/nla.c | 42 +++++++++++++++++++++++++++++++----- libfreerdp/core/transport.c | 2 ++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 2c3be5c9b..01d3b5d08 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -210,10 +210,12 @@ BOOL rdp_client_connect(rdpRdp* rdp) nego_set_cookie(rdp->nego, cookie); free(cookie); + /* settings->RdpSecurity = TRUE; settings->TlsSecurity = TRUE; settings->NlaSecurity = FALSE; settings->ExtSecurity = FALSE; + */ } else @@ -272,6 +274,7 @@ BOOL rdp_client_connect(rdpRdp* rdp) { if (rdp_check_fds(rdp) < 0) return FALSE; + usleep(100); } return TRUE; diff --git a/libfreerdp/core/nla.c b/libfreerdp/core/nla.c index 2978a2a79..895540d3f 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -37,6 +37,7 @@ #include #include "nla.h" +#include "lwd.h" /** * TSRequest ::= SEQUENCE { @@ -137,8 +138,18 @@ int credssp_ntlm_client_init(rdpCredssp* credssp) (char*) credssp->identity.User, (char*) credssp->identity.Domain, (char*) credssp->identity.Password); #endif - sspi_SecBufferAlloc(&credssp->PublicKey, credssp->transport->TlsIn->PublicKeyLength); - CopyMemory(credssp->PublicKey.pvBuffer, credssp->transport->TlsIn->PublicKey, credssp->transport->TlsIn->PublicKeyLength); + rdpTls *tls = NULL; + if(credssp->transport->layer == TRANSPORT_LAYER_TLS) { + tls = credssp->transport->TlsIn; + } else if(credssp->transport->layer == TRANSPORT_LAYER_TSG_TLS) { + tls = credssp->transport->TsgTls; + } else { + fprintf(stderr, "Unknown NLA transport layer\n"); + return 0; + } + + sspi_SecBufferAlloc(&credssp->PublicKey, tls->PublicKeyLength); + CopyMemory(credssp->PublicKey.pvBuffer, tls->PublicKey, tls->PublicKeyLength); length = sizeof(TERMSRV_SPN_PREFIX) + strlen(settings->ServerHostname); @@ -191,10 +202,14 @@ int credssp_client_authenticate(rdpCredssp* credssp) BOOL have_input_buffer; BOOL have_pub_key_auth; + LWD(""); + sspi_GlobalInit(); - if (credssp_ntlm_client_init(credssp) == 0) + if (credssp_ntlm_client_init(credssp) == 0) { + LWD("ret 0 at init"); return 0; + } #ifdef WITH_NATIVE_SSPI { @@ -220,6 +235,7 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (status != SEC_E_OK) { fprintf(stderr, "QuerySecurityPackageInfo status: 0x%08X\n", status); + LWD("QSPI status 0x%X", status); return 0; } @@ -231,6 +247,7 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (status != SEC_E_OK) { fprintf(stderr, "AcquireCredentialsHandle status: 0x%08X\n", status); + LWD("ACH status 0x%X", status); return 0; } @@ -282,6 +299,7 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (credssp->table->QueryContextAttributes(&credssp->context, SECPKG_ATTR_SIZES, &credssp->ContextSizes) != SEC_E_OK) { fprintf(stderr, "QueryContextAttributes SECPKG_ATTR_SIZES failure\n"); + LWD("QCA fail ret 0"); return 0; } @@ -319,8 +337,10 @@ int credssp_client_authenticate(rdpCredssp* credssp) input_buffer_desc.pBuffers = &input_buffer; input_buffer.BufferType = SECBUFFER_TOKEN; - if (credssp_recv(credssp) < 0) + if (credssp_recv(credssp) < 0) { + LWD("credssp_recv ret -1 point 1"); return -1; + } #ifdef WITH_DEBUG_CREDSSP fprintf(stderr, "Receiving Authentication Token (%d)\n", (int) credssp->negoToken.cbBuffer); @@ -335,8 +355,10 @@ int credssp_client_authenticate(rdpCredssp* credssp) } /* Encrypted Public Key +1 */ - if (credssp_recv(credssp) < 0) + if (credssp_recv(credssp) < 0) { + LWD("credssp_recv ret -1 point 2"); return -1; + } /* Verify Server Public Key Echo */ @@ -346,6 +368,7 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (status != SEC_E_OK) { fprintf(stderr, "Could not verify public key echo!\n"); + LWD("verify fail public key ret -1"); return -1; } @@ -356,6 +379,7 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (status != SEC_E_OK) { fprintf(stderr, "credssp_encrypt_ts_credentials status: 0x%08X\n", status); + LWD("credssp encrypt ts cred ret 0"); return 0; } @@ -367,6 +391,7 @@ int credssp_client_authenticate(rdpCredssp* credssp) credssp->table->FreeCredentialsHandle(&credentials); credssp->table->FreeContextBuffer(pPackageInfo); + LWD("ret 1"); return 1; } @@ -1069,6 +1094,10 @@ void credssp_send(rdpCredssp* credssp) ts_request_length = credssp_sizeof_ts_request(length); + LWD("nego_len %d pub_len %d auth_len %d len %d ts_len %d", + nego_tokens_length, pub_key_auth_length, auth_info_length, + length, ts_request_length); + s = Stream_New(NULL, ber_sizeof_sequence(ts_request_length)); /* TSRequest */ @@ -1111,8 +1140,11 @@ void credssp_send(rdpCredssp* credssp) Stream_SealLength(s); + LWD("len %d", Stream_Length(s)); transport_write(credssp->transport, s); + winpr_HexDump(Stream_Buffer(s), Stream_Length(s)); + Stream_Free(s, TRUE); } diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 1554cdd98..7cce9faa0 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -289,8 +289,10 @@ BOOL transport_connect_nla(rdpTransport* transport) freerdp* instance; rdpSettings* settings; + /* if (transport->layer == TRANSPORT_LAYER_TSG || transport->layer == TRANSPORT_LAYER_TSG_TLS) return TRUE; + */ if (!transport_connect_tls(transport)) return FALSE; From a38c3ac794754f658f2cbbd307fc932e050fc4fb Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Mon, 28 Oct 2013 14:54:00 -0600 Subject: [PATCH 12/40] Debug message fix for DEBUG_NLA --- libfreerdp/core/nego.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libfreerdp/core/nego.c b/libfreerdp/core/nego.c index 2e97d059d..448aff7bb 100644 --- a/libfreerdp/core/nego.c +++ b/libfreerdp/core/nego.c @@ -43,11 +43,16 @@ static const char* const NEGO_STATE_STRINGS[] = "NEGO_STATE_FINAL" }; -static const char PROTOCOL_SECURITY_STRINGS[4][4] = +static const char PROTOCOL_SECURITY_STRINGS[9][4] = { "RDP", "TLS", "NLA", + "UNK", + "UNK", + "UNK", + "UNK", + "UNK", "EXT" }; From 1dd2e649e3cf34a4c9139e4629e6cfc1f6227110 Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Mon, 28 Oct 2013 15:08:50 -0600 Subject: [PATCH 13/40] Cleanup pass 1 --- libfreerdp/core/transport.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 7cce9faa0..5fd79e1d0 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -108,8 +108,10 @@ BOOL transport_connect_rdp(rdpTransport* transport) long transport_bio_tsg_callback(BIO* bio, int mode, const char* argp, int argi, long argl, long ret) { -/* printf("transport_bio_tsg_callback: mode: %d argp: %p argi: %d argl: %d ret: %d\n", */ -/* mode, argp, argi, argl, ret); */ + /* + printf("transport_bio_tsg_callback: mode: %d argp: %p argi: %d argl: %d ret: %d\n", + mode, argp, argi, argl, ret); + */ return 1; } @@ -289,11 +291,6 @@ BOOL transport_connect_nla(rdpTransport* transport) freerdp* instance; rdpSettings* settings; - /* - if (transport->layer == TRANSPORT_LAYER_TSG || transport->layer == TRANSPORT_LAYER_TSG_TLS) - return TRUE; - */ - if (!transport_connect_tls(transport)) return FALSE; From f02daaa2d5eadb9fd784c92f3e7359fb08c842f6 Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Mon, 28 Oct 2013 15:46:28 -0600 Subject: [PATCH 14/40] More cleanups - remove LWD and all references. --- include/freerdp/crypto/tls.h | 1 - libfreerdp/core/connection.c | 1 - libfreerdp/core/gateway/rpc.c | 22 --------- libfreerdp/core/nla.c | 29 ++--------- libfreerdp/core/transport.c | 90 ++++------------------------------- libfreerdp/crypto/tls.c | 10 ---- lwd.h | 21 -------- 7 files changed, 12 insertions(+), 162 deletions(-) delete mode 100644 lwd.h diff --git a/include/freerdp/crypto/tls.h b/include/freerdp/crypto/tls.h index c65af3529..a18597308 100644 --- a/include/freerdp/crypto/tls.h +++ b/include/freerdp/crypto/tls.h @@ -49,7 +49,6 @@ struct rdp_tls rdpSettings* settings; SecPkgContext_Bindings* Bindings; rdpCertificateStore* certificate_store; - char desc[20]; }; FREERDP_API BOOL tls_connect(rdpTls* tls); diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 01d3b5d08..f941f219f 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -274,7 +274,6 @@ BOOL rdp_client_connect(rdpRdp* rdp) { if (rdp_check_fds(rdp) < 0) return FALSE; - usleep(100); } return TRUE; diff --git a/libfreerdp/core/gateway/rpc.c b/libfreerdp/core/gateway/rpc.c index 56fa9489d..ae024cd9e 100644 --- a/libfreerdp/core/gateway/rpc.c +++ b/libfreerdp/core/gateway/rpc.c @@ -43,8 +43,6 @@ #include "rpc.h" -#include "lwd.h" - /* Security Verification Trailer Signature */ rpc_sec_verification_trailer RPC_SEC_VERIFICATION_TRAILER = @@ -318,12 +316,8 @@ int rpc_out_read(rdpRpc* rpc, BYTE* data, int length) { int status; - LWD("len %d", length); - status = tls_read(rpc->TlsOut, data, length); - LWD("status %d", status); - return status; } @@ -331,12 +325,8 @@ int rpc_out_write(rdpRpc* rpc, BYTE* data, int length) { int status; - LWD("len %d", length); - status = tls_write_all(rpc->TlsOut, data, length); - LWD("status %d", status); - return status; } @@ -345,20 +335,14 @@ int rpc_in_write(rdpRpc* rpc, BYTE* data, int length) int status; #ifdef WITH_DEBUG_TSG - /* fprintf(stderr, "Sending PDU (length: %d)\n", length); rpc_pdu_header_print((rpcconn_hdr_t*) data); winpr_HexDump(data, length); fprintf(stderr, "\n"); - */ #endif - - LWD("len %d", length); status = tls_write_all(rpc->TlsIn, data, length); - LWD("status %d", status); - return status; } @@ -376,12 +360,9 @@ int rpc_write(rdpRpc* rpc, BYTE* data, int length, UINT16 opnum) ntlm = rpc->ntlm; - LWD("len %d", length); - if (ntlm->table->QueryContextAttributes(&ntlm->context, SECPKG_ATTR_SIZES, &ntlm->ContextSizes) != SEC_E_OK) { fprintf(stderr, "QueryContextAttributes SECPKG_ATTR_SIZES failure\n"); - LWD("status -1 query context"); return -1; } @@ -453,7 +434,6 @@ int rpc_write(rdpRpc* rpc, BYTE* data, int length, UINT16 opnum) { fprintf(stderr, "EncryptMessage status: 0x%08X\n", encrypt_status); free(request_pdu); - LWD("status -1 encrypt_status fail"); return -1; } @@ -464,8 +444,6 @@ int rpc_write(rdpRpc* rpc, BYTE* data, int length, UINT16 opnum) rpc_send_enqueue_pdu(rpc, buffer, request_pdu->frag_length); free(request_pdu); - LWD("status %d", length); - return length; } diff --git a/libfreerdp/core/nla.c b/libfreerdp/core/nla.c index 895540d3f..f0bfbd05a 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -37,7 +37,6 @@ #include #include "nla.h" -#include "lwd.h" /** * TSRequest ::= SEQUENCE { @@ -202,14 +201,10 @@ int credssp_client_authenticate(rdpCredssp* credssp) BOOL have_input_buffer; BOOL have_pub_key_auth; - LWD(""); - sspi_GlobalInit(); - if (credssp_ntlm_client_init(credssp) == 0) { - LWD("ret 0 at init"); + if (credssp_ntlm_client_init(credssp) == 0) return 0; - } #ifdef WITH_NATIVE_SSPI { @@ -235,7 +230,6 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (status != SEC_E_OK) { fprintf(stderr, "QuerySecurityPackageInfo status: 0x%08X\n", status); - LWD("QSPI status 0x%X", status); return 0; } @@ -247,7 +241,6 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (status != SEC_E_OK) { fprintf(stderr, "AcquireCredentialsHandle status: 0x%08X\n", status); - LWD("ACH status 0x%X", status); return 0; } @@ -299,7 +292,6 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (credssp->table->QueryContextAttributes(&credssp->context, SECPKG_ATTR_SIZES, &credssp->ContextSizes) != SEC_E_OK) { fprintf(stderr, "QueryContextAttributes SECPKG_ATTR_SIZES failure\n"); - LWD("QCA fail ret 0"); return 0; } @@ -337,10 +329,8 @@ int credssp_client_authenticate(rdpCredssp* credssp) input_buffer_desc.pBuffers = &input_buffer; input_buffer.BufferType = SECBUFFER_TOKEN; - if (credssp_recv(credssp) < 0) { - LWD("credssp_recv ret -1 point 1"); + if (credssp_recv(credssp) < 0) return -1; - } #ifdef WITH_DEBUG_CREDSSP fprintf(stderr, "Receiving Authentication Token (%d)\n", (int) credssp->negoToken.cbBuffer); @@ -355,10 +345,9 @@ int credssp_client_authenticate(rdpCredssp* credssp) } /* Encrypted Public Key +1 */ - if (credssp_recv(credssp) < 0) { - LWD("credssp_recv ret -1 point 2"); + if (credssp_recv(credssp) < 0) return -1; - } + /* Verify Server Public Key Echo */ @@ -368,7 +357,6 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (status != SEC_E_OK) { fprintf(stderr, "Could not verify public key echo!\n"); - LWD("verify fail public key ret -1"); return -1; } @@ -379,7 +367,6 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (status != SEC_E_OK) { fprintf(stderr, "credssp_encrypt_ts_credentials status: 0x%08X\n", status); - LWD("credssp encrypt ts cred ret 0"); return 0; } @@ -391,7 +378,6 @@ int credssp_client_authenticate(rdpCredssp* credssp) credssp->table->FreeCredentialsHandle(&credentials); credssp->table->FreeContextBuffer(pPackageInfo); - LWD("ret 1"); return 1; } @@ -1094,10 +1080,6 @@ void credssp_send(rdpCredssp* credssp) ts_request_length = credssp_sizeof_ts_request(length); - LWD("nego_len %d pub_len %d auth_len %d len %d ts_len %d", - nego_tokens_length, pub_key_auth_length, auth_info_length, - length, ts_request_length); - s = Stream_New(NULL, ber_sizeof_sequence(ts_request_length)); /* TSRequest */ @@ -1140,11 +1122,8 @@ void credssp_send(rdpCredssp* credssp) Stream_SealLength(s); - LWD("len %d", Stream_Length(s)); transport_write(credssp->transport, s); - winpr_HexDump(Stream_Buffer(s), Stream_Length(s)); - Stream_Free(s, TRUE); } diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 5fd79e1d0..76c13f579 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -49,8 +49,6 @@ #define BUFFER_SIZE 16384 -#include "lwd.h" - static void* transport_client_thread(void* arg); wStream* transport_send_stream_init(rdpTransport* transport, int size) @@ -121,17 +119,9 @@ static int transport_bio_tsg_write(BIO* bio, const char* buf, int num) int status; rdpTsg* tsg; - LWD("len %d", num); - -/* printf("transport_bio_tsg_write: %d\n", num); */ - tsg = (rdpTsg*) bio->ptr; status = tsg_write(tsg, (BYTE*) buf, num); - LWD("status %d", status); - -/* printf("tsg_write: %d\n", status); */ - BIO_clear_retry_flags(bio); if (status <= 0) @@ -147,17 +137,9 @@ static int transport_bio_tsg_read(BIO* bio, char* buf, int size) int status; rdpTsg* tsg; - LWD("len %d", size); - -/* printf("transport_bio_tsg_read: %d\n", size); */ - tsg = (rdpTsg*) bio->ptr; status = tsg_read(bio->ptr, (BYTE*) buf, size); - LWD("status %d", status); - -/* printf("tsg_read: %d\n", status); */ - BIO_clear_retry_flags(bio); if (status <= 0) @@ -233,8 +215,6 @@ BOOL transport_connect_tls(rdpTransport* transport) if (transport->layer == TRANSPORT_LAYER_TSG) { transport->TsgTls = tls_new(transport->settings); - LWD("create TsgTls"); - sprintf(transport->TsgTls->desc, "TsgTls"); transport->TsgTls->methods = BIO_s_tsg(); transport->TsgTls->tsg = (void*) transport->tsg; @@ -256,11 +236,8 @@ BOOL transport_connect_tls(rdpTransport* transport) return TRUE; } - if (transport->TlsIn == NULL) { + if (transport->TlsIn == NULL) transport->TlsIn = tls_new(transport->settings); - LWD("create TlsIn"); - sprintf(transport->TlsIn->desc, "TlsIn"); - } if (transport->TlsOut == NULL) transport->TlsOut = transport->TlsIn; @@ -331,19 +308,13 @@ BOOL transport_tsg_connect(rdpTransport* transport, const char* hostname, UINT16 transport->tsg = tsg; transport->SplitInputOutput = TRUE; - if (transport->TlsIn == NULL) { + if (transport->TlsIn == NULL) transport->TlsIn = tls_new(transport->settings); - LWD("create TlsIn"); - sprintf(transport->TlsIn->desc, "TlsIn"); - } transport->TlsIn->sockfd = transport->TcpIn->sockfd; - if (transport->TlsOut == NULL) { + if (transport->TlsOut == NULL) transport->TlsOut = tls_new(transport->settings); - LWD("create TlsOut"); - sprintf(transport->TlsOut->desc, "TlsOut"); - } transport->TlsOut->sockfd = transport->TcpOut->sockfd; @@ -407,11 +378,8 @@ BOOL transport_accept_rdp(rdpTransport* transport) BOOL transport_accept_tls(rdpTransport* transport) { - if (transport->TlsIn == NULL) { + if (transport->TlsIn == NULL) transport->TlsIn = tls_new(transport->settings); - LWD("create TlsIn"); - sprintf(transport->TlsIn->desc, "TlsIn"); - } if (transport->TlsOut == NULL) transport->TlsOut = transport->TlsIn; @@ -430,11 +398,8 @@ BOOL transport_accept_nla(rdpTransport* transport) freerdp* instance; rdpSettings* settings; - if (transport->TlsIn == NULL) { + if (transport->TlsIn == NULL) transport->TlsIn = tls_new(transport->settings); - LWD("create TlsIn"); - sprintf(transport->TlsIn->desc, "TlsIn"); - } if (transport->TlsOut == NULL) transport->TlsOut = transport->TlsIn; @@ -553,21 +518,9 @@ int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) { int read = 0; int status = -1; - char *layer = "UNKNOWN"; - - if (transport->layer == TRANSPORT_LAYER_TLS) - layer = "TLS"; - else if (transport->layer == TRANSPORT_LAYER_TCP) - layer = "TCP"; - else if (transport->layer == TRANSPORT_LAYER_TSG) - layer = "TSG"; - else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) - layer = "TSG_TLS"; while (read < bytes) { - LWD("layer %s bytes %d read %d", layer, bytes, read); - if (transport->layer == TRANSPORT_LAYER_TLS) status = tls_read(transport->TlsIn, data + read, bytes - read); else if (transport->layer == TRANSPORT_LAYER_TCP) @@ -575,25 +528,16 @@ int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) else if (transport->layer == TRANSPORT_LAYER_TSG) status = tsg_read(transport->tsg, data + read, bytes - read); else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) { - /* - LWD("TlsIn SSL pending %d want %s", SSL_pending(transport->TlsIn->ssl), want(transport->TlsIn)); - LWD("TlsOut SSL pending %d want %s", SSL_pending(transport->TlsOut->ssl), want(transport->TlsOut)); - LWD("TsgTls SSL pending %d want %s", SSL_pending(transport->TsgTls->ssl), want(transport->TlsIn)); - */ status = tls_read(transport->TsgTls, data + read, bytes - read); } /* blocking means that we can't continue until this is read */ - if (!transport->blocking) { - LWD("layer %s return %d not blocking", layer, status); + if (!transport->blocking) return status; - } - if (status < 0) { - LWD("layer %s return %d negative status", layer, status); + if (status < 0) return status; - } read += status; @@ -607,7 +551,6 @@ int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) } } - LWD("layer %s return %d normal", layer, status); return read; } @@ -720,7 +663,6 @@ int transport_write(rdpTransport* transport, wStream* s) { int length; int status = -1; - char *layer = "UNKNOWN"; WaitForSingleObject(transport->WriteMutex, INFINITE); @@ -735,19 +677,8 @@ int transport_write(rdpTransport* transport, wStream* s) } #endif - if (transport->layer == TRANSPORT_LAYER_TLS) - layer = "TLS"; - else if (transport->layer == TRANSPORT_LAYER_TCP) - layer = "TCP"; - else if (transport->layer == TRANSPORT_LAYER_TSG) - layer = "TSG"; - else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) - layer = "TSG_TLS"; - while (length > 0) { - LWD("layer %s length %d", layer, length); - if (transport->layer == TRANSPORT_LAYER_TLS) status = tls_write(transport->TlsOut, Stream_Pointer(s), length); else if (transport->layer == TRANSPORT_LAYER_TCP) @@ -757,15 +688,11 @@ int transport_write(rdpTransport* transport, wStream* s) else if (transport->layer == TRANSPORT_LAYER_TSG_TLS) status = tls_write(transport->TsgTls, Stream_Pointer(s), length); - if (status < 0) { - LWD("layer %s length %d break %d negative status", - layer, length, status); + if (status < 0) break; /* error occurred */ - } if (status == 0) { - LWD("layer %s status 0", layer); /* when sending is blocked in nonblocking mode, the receiving buffer should be checked */ if (!transport->blocking) { @@ -799,7 +726,6 @@ int transport_write(rdpTransport* transport, wStream* s) ReleaseMutex(transport->WriteMutex); - LWD("layer %s return %d", layer, status); return status; } diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index d2d8d7d1d..c3e60e205 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -31,8 +31,6 @@ #include -#include - static CryptoCert tls_get_certificate(rdpTls* tls, BOOL peer) { CryptoCert cert; @@ -375,8 +373,6 @@ int tls_read(rdpTls* tls, BYTE* data, int length) int error; int status; - LWD("tls %s length %d", tls->desc, length); - status = SSL_read(tls->ssl, data, length); if (status <= 0) @@ -415,8 +411,6 @@ int tls_read(rdpTls* tls, BYTE* data, int length) } } - LWD("tls %s ret %d", tls->desc, status); - return status; } @@ -440,8 +434,6 @@ int tls_write(rdpTls* tls, BYTE* data, int length) int error; int status; - LWD("tls %s length %d", tls->desc, length); - status = SSL_write(tls->ssl, data, length); if (status <= 0) @@ -479,8 +471,6 @@ int tls_write(rdpTls* tls, BYTE* data, int length) } } - LWD("tls %s ret %d", tls->desc, status); - return status; } diff --git a/lwd.h b/lwd.h deleted file mode 100644 index c62eb07f0..000000000 --- a/lwd.h +++ /dev/null @@ -1,21 +0,0 @@ - -#ifndef __LWD_H__ -#define __LWD_H__ - -#include -#include -#include - -#define LWD(fmt, ...) do { \ - time_t tod = time(NULL); \ - char buf[25]; \ - struct tm* tm_info = localtime(&tod); \ - strftime(buf, 25, "%H:%M:%S", tm_info); \ - fprintf(stderr, "%20.20s [%s] ", __FUNCTION__, buf); \ - fprintf(stderr, fmt, ## __VA_ARGS__); \ - fprintf(stderr, "\n"); \ - } while( 0 ) - -// fflush(stderr); - -#endif From 7e58dfd22b7e015fffcd895f2df8d1960030d753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 28 Oct 2013 18:21:14 -0400 Subject: [PATCH 15/40] winpr: fix wlog function prototypes --- winpr/include/winpr/wlog.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winpr/include/winpr/wlog.h b/winpr/include/winpr/wlog.h index 2b8b8c7d2..87b79c8a2 100644 --- a/winpr/include/winpr/wlog.h +++ b/winpr/include/winpr/wlog.h @@ -262,11 +262,11 @@ WINPR_API void WLog_FileAppender_SetOutputFilePath(wLog* log, wLogFileAppender* WINPR_API wLogLayout* WLog_GetLogLayout(wLog* log); WINPR_API void WLog_Layout_SetPrefixFormat(wLog* log, wLogLayout* layout, const char* format); -WINPR_API wLog* WLog_GetRoot(); +WINPR_API wLog* WLog_GetRoot(void); WINPR_API wLog* WLog_Get(LPCSTR name); -WINPR_API void WLog_Init(); -WINPR_API void WLog_Uninit(); +WINPR_API void WLog_Init(void); +WINPR_API void WLog_Uninit(void); #ifdef __cplusplus } From 66ecabb647d8be54e32a5291702ca034255724e0 Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Mon, 28 Oct 2013 16:59:02 -0600 Subject: [PATCH 16/40] Final cleanups - merge ready. --- client/X11/cli/xfreerdp.c | 2 -- libfreerdp/core/connection.c | 8 ------- libfreerdp/core/gateway/rpc_client.c | 2 -- libfreerdp/core/nla.c | 1 - libfreerdp/core/transport.c | 31 +--------------------------- libfreerdp/crypto/tls.c | 2 -- 6 files changed, 1 insertion(+), 45 deletions(-) diff --git a/client/X11/cli/xfreerdp.c b/client/X11/cli/xfreerdp.c index dcaf5dbfd..8e39158c2 100644 --- a/client/X11/cli/xfreerdp.c +++ b/client/X11/cli/xfreerdp.c @@ -42,8 +42,6 @@ int main(int argc, char* argv[]) rdpSettings* settings; RDP_CLIENT_ENTRY_POINTS clientEntryPoints; - setvbuf(stderr, NULL, _IONBF, 0); - ZeroMemory(&clientEntryPoints, sizeof(RDP_CLIENT_ENTRY_POINTS)); clientEntryPoints.Size = sizeof(RDP_CLIENT_ENTRY_POINTS); clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION; diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index f941f219f..97030a760 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -209,14 +209,6 @@ BOOL rdp_client_connect(rdpRdp* rdp) nego_set_cookie(rdp->nego, cookie); free(cookie); - - /* - settings->RdpSecurity = TRUE; - settings->TlsSecurity = TRUE; - settings->NlaSecurity = FALSE; - settings->ExtSecurity = FALSE; - */ - } else { diff --git a/libfreerdp/core/gateway/rpc_client.c b/libfreerdp/core/gateway/rpc_client.c index b9ce57122..502ea9dad 100644 --- a/libfreerdp/core/gateway/rpc_client.c +++ b/libfreerdp/core/gateway/rpc_client.c @@ -432,14 +432,12 @@ RPC_PDU* rpc_recv_dequeue_pdu(rdpRpc* rpc) pdu = (RPC_PDU*) Queue_Dequeue(rpc->client->ReceiveQueue); #ifdef WITH_DEBUG_TSG - /* if (pdu) { fprintf(stderr, "Receiving PDU (length: %d, CallId: %d)\n", pdu->s->length, pdu->CallId); winpr_HexDump(Stream_Buffer(pdu->s), Stream_Length(pdu->s)); fprintf(stderr, "\n"); } - */ #endif return pdu; diff --git a/libfreerdp/core/nla.c b/libfreerdp/core/nla.c index f0bfbd05a..34cbc3784 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -348,7 +348,6 @@ int credssp_client_authenticate(rdpCredssp* credssp) if (credssp_recv(credssp) < 0) return -1; - /* Verify Server Public Key Echo */ status = credssp_decrypt_public_key_echo(credssp); diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 76c13f579..e87516472 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -106,11 +106,6 @@ BOOL transport_connect_rdp(rdpTransport* transport) long transport_bio_tsg_callback(BIO* bio, int mode, const char* argp, int argi, long argl, long ret) { - /* - printf("transport_bio_tsg_callback: mode: %d argp: %p argi: %d argl: %d ret: %d\n", - mode, argp, argi, argl, ret); - */ - return 1; } @@ -152,19 +147,16 @@ static int transport_bio_tsg_read(BIO* bio, char* buf, int size) static int transport_bio_tsg_puts(BIO* bio, const char* str) { -/* printf("transport_bio_tsg_puts: %d\n", strlen(str)); */ return 1; } static int transport_bio_tsg_gets(BIO* bio, char* str, int size) { -/* printf("transport_bio_tsg_gets: %d\n", size); */ return 1; } static long transport_bio_tsg_ctrl(BIO* bio, int cmd, long arg1, void* arg2) { -/* printf("transport_bio_tsg_ctrl: cmd: %d arg1: %d arg2: %p\n", cmd, arg1, arg2); */ if(cmd == BIO_CTRL_FLUSH) { return 1; } @@ -173,8 +165,6 @@ static long transport_bio_tsg_ctrl(BIO* bio, int cmd, long arg1, void* arg2) static int transport_bio_tsg_new(BIO* bio) { -/* printf("transport_bio_tsg_new\n"); */ - bio->init = 1; bio->num = 0; bio->ptr = NULL; @@ -185,7 +175,6 @@ static int transport_bio_tsg_new(BIO* bio) static int transport_bio_tsg_free(BIO* bio) { -/* printf("transport_bio_tsg_free\n"); */ return 1; } @@ -400,7 +389,7 @@ BOOL transport_accept_nla(rdpTransport* transport) if (transport->TlsIn == NULL) transport->TlsIn = tls_new(transport->settings); - + if (transport->TlsOut == NULL) transport->TlsOut = transport->TlsIn; @@ -496,24 +485,6 @@ UINT32 nla_header_length(wStream* s) return length; } -char *want(rdpTls *tls) -{ - int what = SSL_want(tls->ssl); - switch(what) - { - case SSL_NOTHING: - return "NOTHING"; - case SSL_WRITING: - return "WRITING"; - case SSL_READING: - return "READING"; - case SSL_X509_LOOKUP: - return "X509_LOOKUP"; - default: - return "UNKNOWN"; - } -} - int transport_read_layer(rdpTransport* transport, UINT8* data, int bytes) { int read = 0; diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index c3e60e205..17d41699a 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -99,8 +99,6 @@ SecPkgContext_Bindings* tls_get_channel_bindings(X509* cert) static void tls_ssl_info_callback(const SSL* ssl, int type, int val) { -/* printf("tls_ssl_info_callback: type: %d val: %d\n", type, val); */ - if (type & SSL_CB_HANDSHAKE_START) { From c0a1c259f31ca675ca62e8d3ef2dea55f6f68ec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 28 Oct 2013 22:09:31 -0400 Subject: [PATCH 17/40] freerdp: start exporting targets automatically --- .gitignore | 2 ++ CMakeLists.txt | 19 +++++++++++++++++++ FreeRDPConfig.cmake.in | 10 ++++++++++ libfreerdp/CMakeLists.txt | 2 +- winpr/CMakeLists.txt | 18 ++++++++++++++++++ winpr/WinPRConfig.cmake.in | 10 ++++++++++ winpr/libwinpr/CMakeLists.txt | 2 +- 7 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 FreeRDPConfig.cmake.in create mode 100644 winpr/WinPRConfig.cmake.in diff --git a/.gitignore b/.gitignore index 869ab7e30..f16bf2091 100755 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,8 @@ _CPack_Packages LICENSE.txt /external/* !external/README +*Config.cmake +*ConfigVersion.cmake *.a.objlist.cmake *.a.objlist diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ecb4df90..f4b0d3102 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,7 @@ include(ComplexLibrary) include(FeatureSummary) include(CheckCCompilerFlag) include(GNUInstallDirsWrapper) +include(CMakePackageConfigHelpers) # Soname versioning set(FREERDP_VERSION_MAJOR "1") @@ -551,6 +552,24 @@ if(WITH_SERVER) add_subdirectory(server) endif() +# Exporting + +export(PACKAGE freerdp) + +set(FREERDP_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/FreeRDP/cmake") + +configure_package_config_file(FreeRDPConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake + INSTALL_DESTINATION ${FREERDP_CMAKE_INSTALL_DIR} + PATH_VARS CMAKE_INSTALL_INCLUDEDIR) + +write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake + VERSION ${FREERDP_VERSION} COMPATIBILITY SameMajorVersion) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake + DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}) + +install(EXPORT FreeRDPTargets DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}) + # Packaging set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake") diff --git a/FreeRDPConfig.cmake.in b/FreeRDPConfig.cmake.in new file mode 100644 index 000000000..dab53fa34 --- /dev/null +++ b/FreeRDPConfig.cmake.in @@ -0,0 +1,10 @@ + +@PACKAGE_INIT@ + +set(FreeRDP_VERSION_MAJOR "@FREERDP_VERSION_MAJOR@") +set(FreeRDP_VERSION_MINOR "@FREERDP_VERSION_MINOR@") +set(FreeRDP_VERSION_PATCH "@FREERDP_VERSION_PATCH@") + +set_and_check(FreeRDP_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") + +include("${CMAKE_CURRENT_LIST_DIR}/FreeRDPTargets.cmake") diff --git a/libfreerdp/CMakeLists.txt b/libfreerdp/CMakeLists.txt index 1dbdb2ce1..f2063e8ea 100644 --- a/libfreerdp/CMakeLists.txt +++ b/libfreerdp/CMakeLists.txt @@ -60,7 +60,7 @@ if(MONOLITHIC_BUILD) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS} ${PROFILER_LIBRARIES}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") endif() diff --git a/winpr/CMakeLists.txt b/winpr/CMakeLists.txt index b4aaf45d2..2870b8943 100644 --- a/winpr/CMakeLists.txt +++ b/winpr/CMakeLists.txt @@ -79,3 +79,21 @@ add_subdirectory(libwinpr) if(NOT ANDROID AND NOT IOS) add_subdirectory(tools) endif() + +# Exporting + +export(PACKAGE winpr) + +set(WINPR_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/WinPR/cmake") + +configure_package_config_file(WinPRConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfig.cmake + INSTALL_DESTINATION ${WINPR_CMAKE_INSTALL_DIR} + PATH_VARS CMAKE_INSTALL_INCLUDEDIR) + +write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/WinPRConfigVersion.cmake + VERSION ${WINPR_VERSION} COMPATIBILITY SameMajorVersion) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfigVersion.cmake + DESTINATION ${WINPR_CMAKE_INSTALL_DIR}) + +install(EXPORT WinPRTargets DESTINATION ${WINPR_CMAKE_INSTALL_DIR}) diff --git a/winpr/WinPRConfig.cmake.in b/winpr/WinPRConfig.cmake.in new file mode 100644 index 000000000..f3adb4def --- /dev/null +++ b/winpr/WinPRConfig.cmake.in @@ -0,0 +1,10 @@ + +@PACKAGE_INIT@ + +set(WinPR_VERSION_MAJOR "@WINPR_VERSION_MAJOR@") +set(WinPR_VERSION_MINOR "@WINPR_VERSION_MINOR@") +set(WinPR_VERSION_PATCH "@WINPR_VERSION_PATCH@") + +set_and_check(WinPR_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") + +include("${CMAKE_CURRENT_LIST_DIR}/WinPRTargets.cmake") diff --git a/winpr/libwinpr/CMakeLists.txt b/winpr/libwinpr/CMakeLists.txt index a0d0f612c..5915ad00a 100644 --- a/winpr/libwinpr/CMakeLists.txt +++ b/winpr/libwinpr/CMakeLists.txt @@ -55,7 +55,7 @@ if(MONOLITHIC_BUILD) target_link_libraries(${MODULE_NAME} ${WINPR_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries EXPORT WinPRTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/libwinpr") endif() From 55565e056c7c9abd19a68374cd54be4cd69b48ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 28 Oct 2013 23:06:39 -0400 Subject: [PATCH 18/40] freerdp: export targets --- channels/audin/client/CMakeLists.txt | 4 ++++ channels/audin/client/alsa/CMakeLists.txt | 4 ++++ channels/audin/client/opensles/CMakeLists.txt | 4 ++++ channels/audin/client/pulse/CMakeLists.txt | 4 ++++ channels/cliprdr/client/CMakeLists.txt | 4 ++++ channels/disp/client/CMakeLists.txt | 5 ++++- channels/drdynvc/client/CMakeLists.txt | 5 ++++- channels/drive/client/CMakeLists.txt | 4 ++++ channels/echo/client/CMakeLists.txt | 5 ++++- channels/parallel/client/CMakeLists.txt | 4 ++++ channels/printer/client/CMakeLists.txt | 4 ++++ channels/rail/client/CMakeLists.txt | 5 ++++- channels/rdpdr/client/CMakeLists.txt | 4 ++++ channels/rdpei/client/CMakeLists.txt | 4 ++++ channels/rdpgfx/client/CMakeLists.txt | 4 ++++ channels/rdpsnd/client/CMakeLists.txt | 6 +++++- channels/rdpsnd/client/alsa/CMakeLists.txt | 4 ++++ channels/rdpsnd/client/ios/CMakeLists.txt | 4 ++++ channels/rdpsnd/client/mac/CMakeLists.txt | 4 ++++ channels/rdpsnd/client/opensles/CMakeLists.txt | 4 ++++ channels/rdpsnd/client/pulse/CMakeLists.txt | 4 ++++ channels/rdpsnd/client/winmm/CMakeLists.txt | 4 ++++ channels/sample/client/CMakeLists.txt | 4 ++++ channels/serial/client/CMakeLists.txt | 5 ++++- channels/smartcard/client/CMakeLists.txt | 5 ++++- channels/tsmf/client/CMakeLists.txt | 4 ++++ channels/tsmf/client/alsa/CMakeLists.txt | 4 ++++ channels/tsmf/client/ffmpeg/CMakeLists.txt | 4 ++++ channels/tsmf/client/gstreamer/CMakeLists.txt | 4 ++++ channels/tsmf/client/pulse/CMakeLists.txt | 3 +++ channels/urbdrc/client/CMakeLists.txt | 4 ++++ client/X11/CMakeLists.txt | 2 +- client/common/CMakeLists.txt | 4 +++- libfreerdp/cache/CMakeLists.txt | 2 +- libfreerdp/codec/CMakeLists.txt | 2 +- libfreerdp/common/CMakeLists.txt | 2 +- libfreerdp/core/CMakeLists.txt | 2 +- libfreerdp/crypto/CMakeLists.txt | 2 +- libfreerdp/gdi/CMakeLists.txt | 2 +- libfreerdp/locale/CMakeLists.txt | 2 +- libfreerdp/primitives/CMakeLists.txt | 2 +- libfreerdp/rail/CMakeLists.txt | 2 +- libfreerdp/utils/CMakeLists.txt | 2 +- winpr/libwinpr/asn1/CMakeLists.txt | 2 +- winpr/libwinpr/bcrypt/CMakeLists.txt | 2 +- winpr/libwinpr/com/CMakeLists.txt | 2 +- winpr/libwinpr/credentials/CMakeLists.txt | 2 +- winpr/libwinpr/credui/CMakeLists.txt | 2 +- winpr/libwinpr/crt/CMakeLists.txt | 2 +- winpr/libwinpr/crypto/CMakeLists.txt | 2 +- winpr/libwinpr/dsparse/CMakeLists.txt | 2 +- winpr/libwinpr/environment/CMakeLists.txt | 2 +- winpr/libwinpr/error/CMakeLists.txt | 2 +- winpr/libwinpr/file/CMakeLists.txt | 2 +- winpr/libwinpr/handle/CMakeLists.txt | 2 +- winpr/libwinpr/heap/CMakeLists.txt | 2 +- winpr/libwinpr/input/CMakeLists.txt | 2 +- winpr/libwinpr/interlocked/CMakeLists.txt | 2 +- winpr/libwinpr/io/CMakeLists.txt | 2 +- winpr/libwinpr/library/CMakeLists.txt | 2 +- winpr/libwinpr/nt/CMakeLists.txt | 2 +- winpr/libwinpr/path/CMakeLists.txt | 2 +- winpr/libwinpr/pipe/CMakeLists.txt | 2 +- winpr/libwinpr/pool/CMakeLists.txt | 2 +- winpr/libwinpr/registry/CMakeLists.txt | 2 +- winpr/libwinpr/rpc/CMakeLists.txt | 2 +- winpr/libwinpr/security/CMakeLists.txt | 2 +- winpr/libwinpr/sspi/CMakeLists.txt | 2 +- winpr/libwinpr/sspicli/CMakeLists.txt | 2 +- winpr/libwinpr/synch/CMakeLists.txt | 2 +- winpr/libwinpr/sysinfo/CMakeLists.txt | 2 +- winpr/libwinpr/thread/CMakeLists.txt | 2 +- winpr/libwinpr/timezone/CMakeLists.txt | 2 +- winpr/libwinpr/utils/CMakeLists.txt | 2 +- winpr/libwinpr/winhttp/CMakeLists.txt | 2 +- winpr/libwinpr/winsock/CMakeLists.txt | 2 +- winpr/libwinpr/wtsapi/CMakeLists.txt | 2 +- 77 files changed, 172 insertions(+), 53 deletions(-) diff --git a/channels/audin/client/CMakeLists.txt b/channels/audin/client/CMakeLists.txt index 0391ed5b6..29eb740b1 100644 --- a/channels/audin/client/CMakeLists.txt +++ b/channels/audin/client/CMakeLists.txt @@ -38,6 +38,10 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") if(WITH_ALSA) diff --git a/channels/audin/client/alsa/CMakeLists.txt b/channels/audin/client/alsa/CMakeLists.txt index 4a4ca6096..03e84d5bc 100644 --- a/channels/audin/client/alsa/CMakeLists.txt +++ b/channels/audin/client/alsa/CMakeLists.txt @@ -39,3 +39,7 @@ target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() + +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() diff --git a/channels/audin/client/opensles/CMakeLists.txt b/channels/audin/client/opensles/CMakeLists.txt index 01e527ebb..2cbafe28d 100644 --- a/channels/audin/client/opensles/CMakeLists.txt +++ b/channels/audin/client/opensles/CMakeLists.txt @@ -42,3 +42,7 @@ target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() + +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() diff --git a/channels/audin/client/pulse/CMakeLists.txt b/channels/audin/client/pulse/CMakeLists.txt index 6c1f59ded..1162647d8 100644 --- a/channels/audin/client/pulse/CMakeLists.txt +++ b/channels/audin/client/pulse/CMakeLists.txt @@ -39,3 +39,7 @@ target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() + +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() diff --git a/channels/cliprdr/client/CMakeLists.txt b/channels/cliprdr/client/CMakeLists.txt index 00c5605a0..05f75d08f 100644 --- a/channels/cliprdr/client/CMakeLists.txt +++ b/channels/cliprdr/client/CMakeLists.txt @@ -41,4 +41,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/disp/client/CMakeLists.txt b/channels/disp/client/CMakeLists.txt index 403a15ce4..eaa972ef0 100644 --- a/channels/disp/client/CMakeLists.txt +++ b/channels/disp/client/CMakeLists.txt @@ -43,5 +43,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/drdynvc/client/CMakeLists.txt b/channels/drdynvc/client/CMakeLists.txt index 0f8f7166a..8e1d2bd39 100644 --- a/channels/drdynvc/client/CMakeLists.txt +++ b/channels/drdynvc/client/CMakeLists.txt @@ -38,5 +38,8 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE winpr MODULES winpr-synch) +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") - diff --git a/channels/drive/client/CMakeLists.txt b/channels/drive/client/CMakeLists.txt index 3e78d10fd..da4796dd1 100644 --- a/channels/drive/client/CMakeLists.txt +++ b/channels/drive/client/CMakeLists.txt @@ -49,4 +49,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/echo/client/CMakeLists.txt b/channels/echo/client/CMakeLists.txt index c9954d23e..b25a645e6 100644 --- a/channels/echo/client/CMakeLists.txt +++ b/channels/echo/client/CMakeLists.txt @@ -38,5 +38,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/parallel/client/CMakeLists.txt b/channels/parallel/client/CMakeLists.txt index 784b02e5a..20eb06090 100644 --- a/channels/parallel/client/CMakeLists.txt +++ b/channels/parallel/client/CMakeLists.txt @@ -40,4 +40,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/printer/client/CMakeLists.txt b/channels/printer/client/CMakeLists.txt index 46302323c..f69189fbc 100644 --- a/channels/printer/client/CMakeLists.txt +++ b/channels/printer/client/CMakeLists.txt @@ -60,4 +60,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/rail/client/CMakeLists.txt b/channels/rail/client/CMakeLists.txt index 2db2b2ddd..79b364c4f 100644 --- a/channels/rail/client/CMakeLists.txt +++ b/channels/rail/client/CMakeLists.txt @@ -36,5 +36,8 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/rdpdr/client/CMakeLists.txt b/channels/rdpdr/client/CMakeLists.txt index 7a1684814..25a09cd18 100644 --- a/channels/rdpdr/client/CMakeLists.txt +++ b/channels/rdpdr/client/CMakeLists.txt @@ -43,4 +43,8 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/rdpei/client/CMakeLists.txt b/channels/rdpei/client/CMakeLists.txt index b96082550..8178b29ca 100644 --- a/channels/rdpei/client/CMakeLists.txt +++ b/channels/rdpei/client/CMakeLists.txt @@ -45,5 +45,9 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/rdpgfx/client/CMakeLists.txt b/channels/rdpgfx/client/CMakeLists.txt index 282a85838..271af0ddc 100644 --- a/channels/rdpgfx/client/CMakeLists.txt +++ b/channels/rdpgfx/client/CMakeLists.txt @@ -45,5 +45,9 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/rdpsnd/client/CMakeLists.txt b/channels/rdpsnd/client/CMakeLists.txt index 8ec9bb336..a2189986e 100644 --- a/channels/rdpsnd/client/CMakeLists.txt +++ b/channels/rdpsnd/client/CMakeLists.txt @@ -37,6 +37,10 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") if(WITH_ALSA) @@ -44,7 +48,7 @@ if(WITH_ALSA) endif() if(WITH_IOSAUDIO) - add_channel_client_subsystem($(MODULE_PREFIX) $(CHANNEL_NAME) "ios" "") + add_channel_client_subsystem(${MODULE_PREFIX} ${CHANNEL_NAME} "ios" "") endif() if(WITH_PULSE) diff --git a/channels/rdpsnd/client/alsa/CMakeLists.txt b/channels/rdpsnd/client/alsa/CMakeLists.txt index 397634c80..b5ba74ce2 100644 --- a/channels/rdpsnd/client/alsa/CMakeLists.txt +++ b/channels/rdpsnd/client/alsa/CMakeLists.txt @@ -45,4 +45,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client/ALSA") diff --git a/channels/rdpsnd/client/ios/CMakeLists.txt b/channels/rdpsnd/client/ios/CMakeLists.txt index 2db67b285..853e3d231 100644 --- a/channels/rdpsnd/client/ios/CMakeLists.txt +++ b/channels/rdpsnd/client/ios/CMakeLists.txt @@ -49,4 +49,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client/ios") diff --git a/channels/rdpsnd/client/mac/CMakeLists.txt b/channels/rdpsnd/client/mac/CMakeLists.txt index 35d9247ec..a77cb332c 100644 --- a/channels/rdpsnd/client/mac/CMakeLists.txt +++ b/channels/rdpsnd/client/mac/CMakeLists.txt @@ -49,4 +49,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client/Mac") diff --git a/channels/rdpsnd/client/opensles/CMakeLists.txt b/channels/rdpsnd/client/opensles/CMakeLists.txt index 0e5660d6a..ee6aedf2a 100644 --- a/channels/rdpsnd/client/opensles/CMakeLists.txt +++ b/channels/rdpsnd/client/opensles/CMakeLists.txt @@ -41,3 +41,7 @@ target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() + +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() diff --git a/channels/rdpsnd/client/pulse/CMakeLists.txt b/channels/rdpsnd/client/pulse/CMakeLists.txt index 3d4a34b76..432b6461a 100644 --- a/channels/rdpsnd/client/pulse/CMakeLists.txt +++ b/channels/rdpsnd/client/pulse/CMakeLists.txt @@ -40,4 +40,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client/Pulse") diff --git a/channels/rdpsnd/client/winmm/CMakeLists.txt b/channels/rdpsnd/client/winmm/CMakeLists.txt index 955fe6ba3..883d84b4a 100644 --- a/channels/rdpsnd/client/winmm/CMakeLists.txt +++ b/channels/rdpsnd/client/winmm/CMakeLists.txt @@ -44,4 +44,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client/WinMM") diff --git a/channels/sample/client/CMakeLists.txt b/channels/sample/client/CMakeLists.txt index a4c163319..2b509b25d 100644 --- a/channels/sample/client/CMakeLists.txt +++ b/channels/sample/client/CMakeLists.txt @@ -34,4 +34,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/serial/client/CMakeLists.txt b/channels/serial/client/CMakeLists.txt index 863daa094..d91c80533 100644 --- a/channels/serial/client/CMakeLists.txt +++ b/channels/serial/client/CMakeLists.txt @@ -38,5 +38,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/smartcard/client/CMakeLists.txt b/channels/smartcard/client/CMakeLists.txt index 5f4bfe37c..aae2bbea9 100644 --- a/channels/smartcard/client/CMakeLists.txt +++ b/channels/smartcard/client/CMakeLists.txt @@ -46,5 +46,8 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/tsmf/client/CMakeLists.txt b/channels/tsmf/client/CMakeLists.txt index 6624ec24a..96a923c42 100644 --- a/channels/tsmf/client/CMakeLists.txt +++ b/channels/tsmf/client/CMakeLists.txt @@ -51,6 +51,10 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") if(WITH_FFMPEG) diff --git a/channels/tsmf/client/alsa/CMakeLists.txt b/channels/tsmf/client/alsa/CMakeLists.txt index bf2528206..124c52f5b 100644 --- a/channels/tsmf/client/alsa/CMakeLists.txt +++ b/channels/tsmf/client/alsa/CMakeLists.txt @@ -39,3 +39,7 @@ target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() + +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() diff --git a/channels/tsmf/client/ffmpeg/CMakeLists.txt b/channels/tsmf/client/ffmpeg/CMakeLists.txt index 827c52234..2a64fb774 100644 --- a/channels/tsmf/client/ffmpeg/CMakeLists.txt +++ b/channels/tsmf/client/ffmpeg/CMakeLists.txt @@ -45,6 +45,10 @@ else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() diff --git a/channels/tsmf/client/gstreamer/CMakeLists.txt b/channels/tsmf/client/gstreamer/CMakeLists.txt index 872831c36..dc544afde 100644 --- a/channels/tsmf/client/gstreamer/CMakeLists.txt +++ b/channels/tsmf/client/gstreamer/CMakeLists.txt @@ -40,6 +40,10 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() diff --git a/channels/tsmf/client/pulse/CMakeLists.txt b/channels/tsmf/client/pulse/CMakeLists.txt index c201b5253..e55f90bab 100644 --- a/channels/tsmf/client/pulse/CMakeLists.txt +++ b/channels/tsmf/client/pulse/CMakeLists.txt @@ -40,3 +40,6 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() diff --git a/channels/urbdrc/client/CMakeLists.txt b/channels/urbdrc/client/CMakeLists.txt index 736097122..6368559db 100644 --- a/channels/urbdrc/client/CMakeLists.txt +++ b/channels/urbdrc/client/CMakeLists.txt @@ -62,6 +62,10 @@ if(NOT STATIC_CHANNELS) install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) endif() +if(NOT BUILD_SHARED_LIBS) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) +endif() + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") # libusb subsystem diff --git a/client/X11/CMakeLists.txt b/client/X11/CMakeLists.txt index 3a8749c56..a02c8d65b 100644 --- a/client/X11/CMakeLists.txt +++ b/client/X11/CMakeLists.txt @@ -204,7 +204,7 @@ if(WITH_IPP) endif() if(WITH_CLIENT_INTERFACE) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries EXPORT FreeRDPTargets) add_subdirectory(cli) else() install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT client) diff --git a/client/common/CMakeLists.txt b/client/common/CMakeLists.txt index 63095575e..3f1b29780 100644 --- a/client/common/CMakeLists.txt +++ b/client/common/CMakeLists.txt @@ -53,9 +53,11 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHI MODULE winpr MODULES winpr-crt winpr-utils) +set_target_properties(${MODULE_NAME} PROPERTIES LINK_INTERFACE_LIBRARIES "") + target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries) +install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Client/Common") diff --git a/libfreerdp/cache/CMakeLists.txt b/libfreerdp/cache/CMakeLists.txt index ef18162d3..d974aae54 100644 --- a/libfreerdp/cache/CMakeLists.txt +++ b/libfreerdp/cache/CMakeLists.txt @@ -43,7 +43,7 @@ if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") diff --git a/libfreerdp/codec/CMakeLists.txt b/libfreerdp/codec/CMakeLists.txt index 19533017b..2c2363e84 100644 --- a/libfreerdp/codec/CMakeLists.txt +++ b/libfreerdp/codec/CMakeLists.txt @@ -102,7 +102,7 @@ if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") diff --git a/libfreerdp/common/CMakeLists.txt b/libfreerdp/common/CMakeLists.txt index 608c43a0d..7f6deab07 100644 --- a/libfreerdp/common/CMakeLists.txt +++ b/libfreerdp/common/CMakeLists.txt @@ -36,7 +36,7 @@ if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") diff --git a/libfreerdp/core/CMakeLists.txt b/libfreerdp/core/CMakeLists.txt index b04b1f79a..89a7d4f9e 100644 --- a/libfreerdp/core/CMakeLists.txt +++ b/libfreerdp/core/CMakeLists.txt @@ -142,7 +142,7 @@ if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") diff --git a/libfreerdp/crypto/CMakeLists.txt b/libfreerdp/crypto/CMakeLists.txt index 15ab8894b..fb5749288 100644 --- a/libfreerdp/crypto/CMakeLists.txt +++ b/libfreerdp/crypto/CMakeLists.txt @@ -66,7 +66,7 @@ if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") diff --git a/libfreerdp/gdi/CMakeLists.txt b/libfreerdp/gdi/CMakeLists.txt index af47c8896..d410bdf4a 100644 --- a/libfreerdp/gdi/CMakeLists.txt +++ b/libfreerdp/gdi/CMakeLists.txt @@ -54,7 +54,7 @@ if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") diff --git a/libfreerdp/locale/CMakeLists.txt b/libfreerdp/locale/CMakeLists.txt index a46a0822f..d5f53799e 100644 --- a/libfreerdp/locale/CMakeLists.txt +++ b/libfreerdp/locale/CMakeLists.txt @@ -90,7 +90,7 @@ if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") diff --git a/libfreerdp/primitives/CMakeLists.txt b/libfreerdp/primitives/CMakeLists.txt index 8aa327c80..f5e01d13f 100644 --- a/libfreerdp/primitives/CMakeLists.txt +++ b/libfreerdp/primitives/CMakeLists.txt @@ -89,7 +89,7 @@ if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") diff --git a/libfreerdp/rail/CMakeLists.txt b/libfreerdp/rail/CMakeLists.txt index 0d4ec619f..c7a9092b4 100644 --- a/libfreerdp/rail/CMakeLists.txt +++ b/libfreerdp/rail/CMakeLists.txt @@ -40,7 +40,7 @@ if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") diff --git a/libfreerdp/utils/CMakeLists.txt b/libfreerdp/utils/CMakeLists.txt index e85e27d37..10b767cd3 100644 --- a/libfreerdp/utils/CMakeLists.txt +++ b/libfreerdp/utils/CMakeLists.txt @@ -64,7 +64,7 @@ if(MONOLITHIC_BUILD) set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "FreeRDP/libfreerdp") diff --git a/winpr/libwinpr/asn1/CMakeLists.txt b/winpr/libwinpr/asn1/CMakeLists.txt index 7f5c7599d..284b8c713 100644 --- a/winpr/libwinpr/asn1/CMakeLists.txt +++ b/winpr/libwinpr/asn1/CMakeLists.txt @@ -34,7 +34,7 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SO if(MONOLITHIC_BUILD) else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/bcrypt/CMakeLists.txt b/winpr/libwinpr/bcrypt/CMakeLists.txt index f9038698d..ca0ffee68 100644 --- a/winpr/libwinpr/bcrypt/CMakeLists.txt +++ b/winpr/libwinpr/bcrypt/CMakeLists.txt @@ -42,7 +42,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/com/CMakeLists.txt b/winpr/libwinpr/com/CMakeLists.txt index 826c678f3..8cf9bef30 100644 --- a/winpr/libwinpr/com/CMakeLists.txt +++ b/winpr/libwinpr/com/CMakeLists.txt @@ -39,7 +39,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/credentials/CMakeLists.txt b/winpr/libwinpr/credentials/CMakeLists.txt index ebcc91ba4..5748791b6 100644 --- a/winpr/libwinpr/credentials/CMakeLists.txt +++ b/winpr/libwinpr/credentials/CMakeLists.txt @@ -34,7 +34,7 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SO if(MONOLITHIC_BUILD) else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/credui/CMakeLists.txt b/winpr/libwinpr/credui/CMakeLists.txt index 97166ec52..2f59aa252 100644 --- a/winpr/libwinpr/credui/CMakeLists.txt +++ b/winpr/libwinpr/credui/CMakeLists.txt @@ -39,7 +39,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/crt/CMakeLists.txt b/winpr/libwinpr/crt/CMakeLists.txt index 5d91a5062..a6d42f308 100644 --- a/winpr/libwinpr/crt/CMakeLists.txt +++ b/winpr/libwinpr/crt/CMakeLists.txt @@ -46,7 +46,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS if(MONOLITHIC_BUILD) else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/crypto/CMakeLists.txt b/winpr/libwinpr/crypto/CMakeLists.txt index 6a4c65572..c1c5e822c 100644 --- a/winpr/libwinpr/crypto/CMakeLists.txt +++ b/winpr/libwinpr/crypto/CMakeLists.txt @@ -40,7 +40,7 @@ endif() if(MONOLITHIC_BUILD) else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/dsparse/CMakeLists.txt b/winpr/libwinpr/dsparse/CMakeLists.txt index 0cbd4452a..a92753ae9 100644 --- a/winpr/libwinpr/dsparse/CMakeLists.txt +++ b/winpr/libwinpr/dsparse/CMakeLists.txt @@ -39,7 +39,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/environment/CMakeLists.txt b/winpr/libwinpr/environment/CMakeLists.txt index 6f5ab2c77..88a5db719 100644 --- a/winpr/libwinpr/environment/CMakeLists.txt +++ b/winpr/libwinpr/environment/CMakeLists.txt @@ -34,7 +34,7 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SO if(MONOLITHIC_BUILD) else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/error/CMakeLists.txt b/winpr/libwinpr/error/CMakeLists.txt index eb78993c6..440544f90 100644 --- a/winpr/libwinpr/error/CMakeLists.txt +++ b/winpr/libwinpr/error/CMakeLists.txt @@ -40,7 +40,7 @@ if(MONOLITHIC_BUILD) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/file/CMakeLists.txt b/winpr/libwinpr/file/CMakeLists.txt index 38a72d797..6c9bac92f 100644 --- a/winpr/libwinpr/file/CMakeLists.txt +++ b/winpr/libwinpr/file/CMakeLists.txt @@ -37,7 +37,7 @@ if(MONOLITHIC_BUILD) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/handle/CMakeLists.txt b/winpr/libwinpr/handle/CMakeLists.txt index db25fea70..2beef603e 100644 --- a/winpr/libwinpr/handle/CMakeLists.txt +++ b/winpr/libwinpr/handle/CMakeLists.txt @@ -45,7 +45,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/heap/CMakeLists.txt b/winpr/libwinpr/heap/CMakeLists.txt index 54f4ad940..cd3a742f1 100644 --- a/winpr/libwinpr/heap/CMakeLists.txt +++ b/winpr/libwinpr/heap/CMakeLists.txt @@ -34,7 +34,7 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SO if(MONOLITHIC_BUILD) else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/input/CMakeLists.txt b/winpr/libwinpr/input/CMakeLists.txt index 295910635..5ad8381ca 100644 --- a/winpr/libwinpr/input/CMakeLists.txt +++ b/winpr/libwinpr/input/CMakeLists.txt @@ -38,7 +38,7 @@ if(MONOLITHIC_BUILD) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/interlocked/CMakeLists.txt b/winpr/libwinpr/interlocked/CMakeLists.txt index 431834bc4..19af54175 100644 --- a/winpr/libwinpr/interlocked/CMakeLists.txt +++ b/winpr/libwinpr/interlocked/CMakeLists.txt @@ -44,7 +44,7 @@ if(MONOLITHIC_BUILD) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/io/CMakeLists.txt b/winpr/libwinpr/io/CMakeLists.txt index 74944f47c..58041b4a3 100644 --- a/winpr/libwinpr/io/CMakeLists.txt +++ b/winpr/libwinpr/io/CMakeLists.txt @@ -35,7 +35,7 @@ if(MONOLITHIC_BUILD) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/library/CMakeLists.txt b/winpr/libwinpr/library/CMakeLists.txt index 5612155d6..5873d8ea9 100644 --- a/winpr/libwinpr/library/CMakeLists.txt +++ b/winpr/libwinpr/library/CMakeLists.txt @@ -37,7 +37,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/nt/CMakeLists.txt b/winpr/libwinpr/nt/CMakeLists.txt index 451a7696b..db0199451 100644 --- a/winpr/libwinpr/nt/CMakeLists.txt +++ b/winpr/libwinpr/nt/CMakeLists.txt @@ -48,7 +48,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/path/CMakeLists.txt b/winpr/libwinpr/path/CMakeLists.txt index ecd9b0bca..9af4206eb 100644 --- a/winpr/libwinpr/path/CMakeLists.txt +++ b/winpr/libwinpr/path/CMakeLists.txt @@ -37,7 +37,7 @@ if(MONOLITHIC_BUILD) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/pipe/CMakeLists.txt b/winpr/libwinpr/pipe/CMakeLists.txt index 330e188d6..bf0b98fb4 100644 --- a/winpr/libwinpr/pipe/CMakeLists.txt +++ b/winpr/libwinpr/pipe/CMakeLists.txt @@ -41,7 +41,7 @@ if(MONOLITHIC_BUILD) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/pool/CMakeLists.txt b/winpr/libwinpr/pool/CMakeLists.txt index e14033681..3ae10f0e1 100644 --- a/winpr/libwinpr/pool/CMakeLists.txt +++ b/winpr/libwinpr/pool/CMakeLists.txt @@ -57,7 +57,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/registry/CMakeLists.txt b/winpr/libwinpr/registry/CMakeLists.txt index 382bc572a..bbf1fd125 100644 --- a/winpr/libwinpr/registry/CMakeLists.txt +++ b/winpr/libwinpr/registry/CMakeLists.txt @@ -37,7 +37,7 @@ if(MONOLITHIC_BUILD) else() target_link_libraries(${MODULE_NAME} winpr-utils) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/rpc/CMakeLists.txt b/winpr/libwinpr/rpc/CMakeLists.txt index 1214db37b..41093596c 100644 --- a/winpr/libwinpr/rpc/CMakeLists.txt +++ b/winpr/libwinpr/rpc/CMakeLists.txt @@ -68,7 +68,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/security/CMakeLists.txt b/winpr/libwinpr/security/CMakeLists.txt index 0985854e2..aad728d3d 100644 --- a/winpr/libwinpr/security/CMakeLists.txt +++ b/winpr/libwinpr/security/CMakeLists.txt @@ -37,7 +37,7 @@ else() install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() -set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR" EXPORT WinPRTargets) if(BUILD_TESTING) add_subdirectory(test) diff --git a/winpr/libwinpr/sspi/CMakeLists.txt b/winpr/libwinpr/sspi/CMakeLists.txt index 2811b57fd..7bfe934f3 100644 --- a/winpr/libwinpr/sspi/CMakeLists.txt +++ b/winpr/libwinpr/sspi/CMakeLists.txt @@ -87,7 +87,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/sspicli/CMakeLists.txt b/winpr/libwinpr/sspicli/CMakeLists.txt index 0a02f1949..e8b11688c 100644 --- a/winpr/libwinpr/sspicli/CMakeLists.txt +++ b/winpr/libwinpr/sspicli/CMakeLists.txt @@ -30,7 +30,7 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SO if(MONOLITHIC_BUILD) else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/synch/CMakeLists.txt b/winpr/libwinpr/synch/CMakeLists.txt index 39bbb11b1..e0ab22833 100644 --- a/winpr/libwinpr/synch/CMakeLists.txt +++ b/winpr/libwinpr/synch/CMakeLists.txt @@ -68,7 +68,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/sysinfo/CMakeLists.txt b/winpr/libwinpr/sysinfo/CMakeLists.txt index 769885818..1de26d40e 100644 --- a/winpr/libwinpr/sysinfo/CMakeLists.txt +++ b/winpr/libwinpr/sysinfo/CMakeLists.txt @@ -39,7 +39,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/thread/CMakeLists.txt b/winpr/libwinpr/thread/CMakeLists.txt index eeb68ba5b..55d02ab43 100644 --- a/winpr/libwinpr/thread/CMakeLists.txt +++ b/winpr/libwinpr/thread/CMakeLists.txt @@ -53,7 +53,7 @@ if(MONOLITHIC_BUILD) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/timezone/CMakeLists.txt b/winpr/libwinpr/timezone/CMakeLists.txt index 78071a6fb..f5bd4e26e 100644 --- a/winpr/libwinpr/timezone/CMakeLists.txt +++ b/winpr/libwinpr/timezone/CMakeLists.txt @@ -30,7 +30,7 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SO if(MONOLITHIC_BUILD) else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/utils/CMakeLists.txt b/winpr/libwinpr/utils/CMakeLists.txt index fd9f95398..b156a2bf2 100644 --- a/winpr/libwinpr/utils/CMakeLists.txt +++ b/winpr/libwinpr/utils/CMakeLists.txt @@ -111,7 +111,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/winhttp/CMakeLists.txt b/winpr/libwinpr/winhttp/CMakeLists.txt index d0cf4aaad..3c268843d 100644 --- a/winpr/libwinpr/winhttp/CMakeLists.txt +++ b/winpr/libwinpr/winhttp/CMakeLists.txt @@ -30,7 +30,7 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SO if(MONOLITHIC_BUILD) else() - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/winsock/CMakeLists.txt b/winpr/libwinpr/winsock/CMakeLists.txt index 446350c26..cc378ae54 100644 --- a/winpr/libwinpr/winsock/CMakeLists.txt +++ b/winpr/libwinpr/winsock/CMakeLists.txt @@ -35,7 +35,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") diff --git a/winpr/libwinpr/wtsapi/CMakeLists.txt b/winpr/libwinpr/wtsapi/CMakeLists.txt index 07a933c70..f00c62109 100644 --- a/winpr/libwinpr/wtsapi/CMakeLists.txt +++ b/winpr/libwinpr/wtsapi/CMakeLists.txt @@ -42,7 +42,7 @@ if(MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT WinPRTargets) endif() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR") From 37450da55dcefdd3fdd821a0d22e2a87ee1686ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Tue, 29 Oct 2013 14:47:40 -0400 Subject: [PATCH 19/40] cmake: fix exporting of targets on pre-2.8.11 --- CMakeLists.txt | 26 +- FreeRDPConfig.cmake.in | 2 +- channels/audin/client/CMakeLists.txt | 8 +- channels/audin/client/opensles/CMakeLists.txt | 8 +- channels/audin/client/pulse/CMakeLists.txt | 8 +- channels/audin/server/CMakeLists.txt | 2 + channels/cliprdr/client/CMakeLists.txt | 8 +- channels/cliprdr/server/CMakeLists.txt | 2 + channels/disp/client/CMakeLists.txt | 8 +- channels/drdynvc/client/CMakeLists.txt | 4 +- channels/drdynvc/server/CMakeLists.txt | 2 + channels/drive/client/CMakeLists.txt | 8 +- channels/echo/client/CMakeLists.txt | 8 +- channels/parallel/client/CMakeLists.txt | 8 +- channels/printer/client/CMakeLists.txt | 8 +- channels/rail/client/CMakeLists.txt | 4 +- channels/rdpdr/client/CMakeLists.txt | 4 +- channels/rdpdr/server/CMakeLists.txt | 2 + channels/rdpei/client/CMakeLists.txt | 9 +- channels/rdpgfx/client/CMakeLists.txt | 8 +- channels/rdpsnd/client/CMakeLists.txt | 4 +- channels/rdpsnd/client/alsa/CMakeLists.txt | 8 +- channels/rdpsnd/client/ios/CMakeLists.txt | 8 +- channels/rdpsnd/client/mac/CMakeLists.txt | 8 +- .../rdpsnd/client/opensles/CMakeLists.txt | 8 +- channels/rdpsnd/client/pulse/CMakeLists.txt | 8 +- channels/rdpsnd/client/winmm/CMakeLists.txt | 8 +- channels/rdpsnd/server/CMakeLists.txt | 2 + channels/sample/client/CMakeLists.txt | 8 +- channels/serial/client/CMakeLists.txt | 8 +- channels/smartcard/client/CMakeLists.txt | 8 +- channels/tsmf/client/CMakeLists.txt | 8 +- channels/tsmf/client/alsa/CMakeLists.txt | 8 +- channels/tsmf/client/ffmpeg/CMakeLists.txt | 17 +- channels/tsmf/client/gstreamer/CMakeLists.txt | 8 +- channels/tsmf/client/pulse/CMakeLists.txt | 8 +- channels/urbdrc/client/CMakeLists.txt | 8 +- client/Windows/CMakeLists.txt | 2 +- cmake/CheckCmakeCompat.cmake | 3 +- ...asicConfigVersion-AnyNewerVersion.cmake.in | 31 +++ .../BasicConfigVersion-ExactVersion.cmake.in | 47 ++++ ...sicConfigVersion-SameMajorVersion.cmake.in | 46 ++++ .../CMakePackageConfigHelpers.cmake | 248 ++++++++++++++++++ .../WriteBasicConfigVersionFile.cmake | 50 ++++ server/common/CMakeLists.txt | 2 +- winpr/CMakeLists.txt | 31 ++- winpr/WinPRConfig.cmake.in | 2 +- winpr/tools/makecert/CMakeLists.txt | 2 +- 48 files changed, 509 insertions(+), 227 deletions(-) create mode 100644 cmake/compat_2.8.11/BasicConfigVersion-AnyNewerVersion.cmake.in create mode 100644 cmake/compat_2.8.11/BasicConfigVersion-ExactVersion.cmake.in create mode 100644 cmake/compat_2.8.11/BasicConfigVersion-SameMajorVersion.cmake.in create mode 100644 cmake/compat_2.8.11/CMakePackageConfigHelpers.cmake create mode 100644 cmake/compat_2.8.11/WriteBasicConfigVersionFile.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index f4b0d3102..a319b17d6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -554,21 +554,27 @@ endif() # Exporting -export(PACKAGE freerdp) +if(${CMAKE_VERSION} VERSION_GREATER "2.8.10") -set(FREERDP_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/FreeRDP/cmake") + export(PACKAGE freerdp) -configure_package_config_file(FreeRDPConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake - INSTALL_DESTINATION ${FREERDP_CMAKE_INSTALL_DIR} - PATH_VARS CMAKE_INSTALL_INCLUDEDIR) + set(FREERDP_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/FreeRDP/cmake") -write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake - VERSION ${FREERDP_VERSION} COMPATIBILITY SameMajorVersion) + set(FREERDP_INCLUDE_DIR "include") -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake - DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}) + configure_package_config_file(FreeRDPConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake + INSTALL_DESTINATION ${FREERDP_CMAKE_INSTALL_DIR} + PATH_VARS FREERDP_INCLUDE_DIR) -install(EXPORT FreeRDPTargets DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}) + write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake + VERSION ${FREERDP_VERSION} COMPATIBILITY SameMajorVersion) + + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake + DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}) + + install(EXPORT FreeRDPTargets DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}) + +endif() # Packaging diff --git a/FreeRDPConfig.cmake.in b/FreeRDPConfig.cmake.in index dab53fa34..9b8f9b9a8 100644 --- a/FreeRDPConfig.cmake.in +++ b/FreeRDPConfig.cmake.in @@ -5,6 +5,6 @@ set(FreeRDP_VERSION_MAJOR "@FREERDP_VERSION_MAJOR@") set(FreeRDP_VERSION_MINOR "@FREERDP_VERSION_MINOR@") set(FreeRDP_VERSION_PATCH "@FREERDP_VERSION_PATCH@") -set_and_check(FreeRDP_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") +set_and_check(FreeRDP_INCLUDE_DIR "@PACKAGE_FREERDP_INCLUDE_DIR@") include("${CMAKE_CURRENT_LIST_DIR}/FreeRDPTargets.cmake") diff --git a/channels/audin/client/CMakeLists.txt b/channels/audin/client/CMakeLists.txt index 29eb740b1..2a370743c 100644 --- a/channels/audin/client/CMakeLists.txt +++ b/channels/audin/client/CMakeLists.txt @@ -34,13 +34,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/audin/client/opensles/CMakeLists.txt b/channels/audin/client/opensles/CMakeLists.txt index 2cbafe28d..ff872e69d 100644 --- a/channels/audin/client/opensles/CMakeLists.txt +++ b/channels/audin/client/opensles/CMakeLists.txt @@ -39,10 +39,4 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${OPENSLES_LIBRARIES}) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/audin/client/pulse/CMakeLists.txt b/channels/audin/client/pulse/CMakeLists.txt index 1162647d8..f0ddd34a2 100644 --- a/channels/audin/client/pulse/CMakeLists.txt +++ b/channels/audin/client/pulse/CMakeLists.txt @@ -36,10 +36,4 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${PULSE_LIBRARY}) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/audin/server/CMakeLists.txt b/channels/audin/server/CMakeLists.txt index 7da71e81c..a95da3909 100644 --- a/channels/audin/server/CMakeLists.txt +++ b/channels/audin/server/CMakeLists.txt @@ -29,4 +29,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-codec freerdp-utils) +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Server") diff --git a/channels/cliprdr/client/CMakeLists.txt b/channels/cliprdr/client/CMakeLists.txt index 05f75d08f..4df74c706 100644 --- a/channels/cliprdr/client/CMakeLists.txt +++ b/channels/cliprdr/client/CMakeLists.txt @@ -37,12 +37,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE winpr MODULES winpr-crt) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/cliprdr/server/CMakeLists.txt b/channels/cliprdr/server/CMakeLists.txt index 3e2ef0b2d..5abc3d511 100644 --- a/channels/cliprdr/server/CMakeLists.txt +++ b/channels/cliprdr/server/CMakeLists.txt @@ -32,4 +32,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Server") diff --git a/channels/disp/client/CMakeLists.txt b/channels/disp/client/CMakeLists.txt index eaa972ef0..704ce2334 100644 --- a/channels/disp/client/CMakeLists.txt +++ b/channels/disp/client/CMakeLists.txt @@ -39,12 +39,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/drdynvc/client/CMakeLists.txt b/channels/drdynvc/client/CMakeLists.txt index 8e1d2bd39..124397d46 100644 --- a/channels/drdynvc/client/CMakeLists.txt +++ b/channels/drdynvc/client/CMakeLists.txt @@ -38,8 +38,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE winpr MODULES winpr-synch) -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/drdynvc/server/CMakeLists.txt b/channels/drdynvc/server/CMakeLists.txt index 8b7c27d25..f31e55815 100644 --- a/channels/drdynvc/server/CMakeLists.txt +++ b/channels/drdynvc/server/CMakeLists.txt @@ -32,4 +32,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Server") diff --git a/channels/drive/client/CMakeLists.txt b/channels/drive/client/CMakeLists.txt index da4796dd1..b7f0b8d94 100644 --- a/channels/drive/client/CMakeLists.txt +++ b/channels/drive/client/CMakeLists.txt @@ -45,12 +45,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/echo/client/CMakeLists.txt b/channels/echo/client/CMakeLists.txt index b25a645e6..54417f093 100644 --- a/channels/echo/client/CMakeLists.txt +++ b/channels/echo/client/CMakeLists.txt @@ -34,12 +34,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/parallel/client/CMakeLists.txt b/channels/parallel/client/CMakeLists.txt index 20eb06090..e9a87261d 100644 --- a/channels/parallel/client/CMakeLists.txt +++ b/channels/parallel/client/CMakeLists.txt @@ -36,12 +36,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/printer/client/CMakeLists.txt b/channels/printer/client/CMakeLists.txt index f69189fbc..861de097e 100644 --- a/channels/printer/client/CMakeLists.txt +++ b/channels/printer/client/CMakeLists.txt @@ -56,12 +56,6 @@ endif() target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/rail/client/CMakeLists.txt b/channels/rail/client/CMakeLists.txt index 79b364c4f..b44ce1614 100644 --- a/channels/rail/client/CMakeLists.txt +++ b/channels/rail/client/CMakeLists.txt @@ -36,8 +36,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/rdpdr/client/CMakeLists.txt b/channels/rdpdr/client/CMakeLists.txt index 25a09cd18..241849b9f 100644 --- a/channels/rdpdr/client/CMakeLists.txt +++ b/channels/rdpdr/client/CMakeLists.txt @@ -43,8 +43,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/rdpdr/server/CMakeLists.txt b/channels/rdpdr/server/CMakeLists.txt index a7dd06c03..17a18967e 100644 --- a/channels/rdpdr/server/CMakeLists.txt +++ b/channels/rdpdr/server/CMakeLists.txt @@ -32,4 +32,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Server") diff --git a/channels/rdpei/client/CMakeLists.txt b/channels/rdpei/client/CMakeLists.txt index 8178b29ca..2d3adf24c 100644 --- a/channels/rdpei/client/CMakeLists.txt +++ b/channels/rdpei/client/CMakeLists.txt @@ -41,13 +41,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") - diff --git a/channels/rdpgfx/client/CMakeLists.txt b/channels/rdpgfx/client/CMakeLists.txt index 271af0ddc..2e76c8ced 100644 --- a/channels/rdpgfx/client/CMakeLists.txt +++ b/channels/rdpgfx/client/CMakeLists.txt @@ -41,13 +41,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/rdpsnd/client/CMakeLists.txt b/channels/rdpsnd/client/CMakeLists.txt index a2189986e..64bdb2bff 100644 --- a/channels/rdpsnd/client/CMakeLists.txt +++ b/channels/rdpsnd/client/CMakeLists.txt @@ -37,9 +37,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/rdpsnd/client/alsa/CMakeLists.txt b/channels/rdpsnd/client/alsa/CMakeLists.txt index b5ba74ce2..d96a0495c 100644 --- a/channels/rdpsnd/client/alsa/CMakeLists.txt +++ b/channels/rdpsnd/client/alsa/CMakeLists.txt @@ -41,12 +41,6 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${ALSA_LIBRARIES}) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client/ALSA") diff --git a/channels/rdpsnd/client/ios/CMakeLists.txt b/channels/rdpsnd/client/ios/CMakeLists.txt index 853e3d231..673a4f99c 100644 --- a/channels/rdpsnd/client/ios/CMakeLists.txt +++ b/channels/rdpsnd/client/ios/CMakeLists.txt @@ -45,12 +45,6 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client/ios") diff --git a/channels/rdpsnd/client/mac/CMakeLists.txt b/channels/rdpsnd/client/mac/CMakeLists.txt index a77cb332c..8a6f93cb8 100644 --- a/channels/rdpsnd/client/mac/CMakeLists.txt +++ b/channels/rdpsnd/client/mac/CMakeLists.txt @@ -45,12 +45,6 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client/Mac") diff --git a/channels/rdpsnd/client/opensles/CMakeLists.txt b/channels/rdpsnd/client/opensles/CMakeLists.txt index ee6aedf2a..dc5465a8e 100644 --- a/channels/rdpsnd/client/opensles/CMakeLists.txt +++ b/channels/rdpsnd/client/opensles/CMakeLists.txt @@ -38,10 +38,4 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${OPENSLES_LIBRARIES}) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/rdpsnd/client/pulse/CMakeLists.txt b/channels/rdpsnd/client/pulse/CMakeLists.txt index 432b6461a..d652ba234 100644 --- a/channels/rdpsnd/client/pulse/CMakeLists.txt +++ b/channels/rdpsnd/client/pulse/CMakeLists.txt @@ -36,12 +36,6 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${PULSE_LIBRARY}) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client/Pulse") diff --git a/channels/rdpsnd/client/winmm/CMakeLists.txt b/channels/rdpsnd/client/winmm/CMakeLists.txt index 883d84b4a..a75d5fe1c 100644 --- a/channels/rdpsnd/client/winmm/CMakeLists.txt +++ b/channels/rdpsnd/client/winmm/CMakeLists.txt @@ -40,12 +40,6 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winmm.lib) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client/WinMM") diff --git a/channels/rdpsnd/server/CMakeLists.txt b/channels/rdpsnd/server/CMakeLists.txt index c98816d68..a5f784679 100644 --- a/channels/rdpsnd/server/CMakeLists.txt +++ b/channels/rdpsnd/server/CMakeLists.txt @@ -32,4 +32,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) + set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Server") diff --git a/channels/sample/client/CMakeLists.txt b/channels/sample/client/CMakeLists.txt index 2b509b25d..da50c7efc 100644 --- a/channels/sample/client/CMakeLists.txt +++ b/channels/sample/client/CMakeLists.txt @@ -30,12 +30,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MODULE freerdp MODULES freerdp-utils) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/serial/client/CMakeLists.txt b/channels/serial/client/CMakeLists.txt index d91c80533..d170689b5 100644 --- a/channels/serial/client/CMakeLists.txt +++ b/channels/serial/client/CMakeLists.txt @@ -34,12 +34,6 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/smartcard/client/CMakeLists.txt b/channels/smartcard/client/CMakeLists.txt index aae2bbea9..859ea9b67 100644 --- a/channels/smartcard/client/CMakeLists.txt +++ b/channels/smartcard/client/CMakeLists.txt @@ -42,12 +42,6 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${PCSC_LIBRARIES}) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/tsmf/client/CMakeLists.txt b/channels/tsmf/client/CMakeLists.txt index 96a923c42..18f463d4f 100644 --- a/channels/tsmf/client/CMakeLists.txt +++ b/channels/tsmf/client/CMakeLists.txt @@ -47,13 +47,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/channels/tsmf/client/alsa/CMakeLists.txt b/channels/tsmf/client/alsa/CMakeLists.txt index 124c52f5b..8e1fbde13 100644 --- a/channels/tsmf/client/alsa/CMakeLists.txt +++ b/channels/tsmf/client/alsa/CMakeLists.txt @@ -36,10 +36,4 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${ALSA_LIBRARIES}) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/tsmf/client/ffmpeg/CMakeLists.txt b/channels/tsmf/client/ffmpeg/CMakeLists.txt index 2a64fb774..c321d7013 100644 --- a/channels/tsmf/client/ffmpeg/CMakeLists.txt +++ b/channels/tsmf/client/ffmpeg/CMakeLists.txt @@ -31,24 +31,17 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} MODULE freerdp MODULES freerdp-utils) - if(APPLE) # For this to work on apple, we need to add some frameworks - FIND_LIBRARY(COREFOUNDATION_LIBRARY CoreFoundation ) - FIND_LIBRARY(COREVIDEO_LIBRARY CoreVideo ) - FIND_LIBRARY(COREVIDEODECODE_LIBRARY VideoDecodeAcceleration ) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${FFMPEG_LIBRARIES} ${COREFOUNDATION_LIBRARY} ${COREVIDEO_LIBRARY} ${COREVIDEODECODE_LIBRARY} ) + FIND_LIBRARY(COREFOUNDATION_LIBRARY CoreFoundation) + FIND_LIBRARY(COREVIDEO_LIBRARY CoreVideo) + FIND_LIBRARY(COREVIDEODECODE_LIBRARY VideoDecodeAcceleration) + set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${FFMPEG_LIBRARIES} ${COREFOUNDATION_LIBRARY} ${COREVIDEO_LIBRARY} ${COREVIDEODECODE_LIBRARY}) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) else() set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${FFMPEG_LIBRARIES}) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) endif() -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() - -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/tsmf/client/gstreamer/CMakeLists.txt b/channels/tsmf/client/gstreamer/CMakeLists.txt index dc544afde..5080358c8 100644 --- a/channels/tsmf/client/gstreamer/CMakeLists.txt +++ b/channels/tsmf/client/gstreamer/CMakeLists.txt @@ -40,10 +40,4 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() - -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/tsmf/client/pulse/CMakeLists.txt b/channels/tsmf/client/pulse/CMakeLists.txt index e55f90bab..cdfa7fe5a 100644 --- a/channels/tsmf/client/pulse/CMakeLists.txt +++ b/channels/tsmf/client/pulse/CMakeLists.txt @@ -36,10 +36,4 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ${PULSE_LIBRARY}) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) diff --git a/channels/urbdrc/client/CMakeLists.txt b/channels/urbdrc/client/CMakeLists.txt index 6368559db..14f62b884 100644 --- a/channels/urbdrc/client/CMakeLists.txt +++ b/channels/urbdrc/client/CMakeLists.txt @@ -58,13 +58,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -if(NOT STATIC_CHANNELS) - install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) -endif() - -if(NOT BUILD_SHARED_LIBS) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT FreeRDPTargets) -endif() +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_ADDIN_PATH} EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Client") diff --git a/client/Windows/CMakeLists.txt b/client/Windows/CMakeLists.txt index 0f2b26d65..5bc2d5eef 100644 --- a/client/Windows/CMakeLists.txt +++ b/client/Windows/CMakeLists.txt @@ -63,7 +63,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) if(WITH_CLIENT_INTERFACE) - install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries) + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries EXPORT WinPRTargets) add_subdirectory(cli) else() install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT client) diff --git a/cmake/CheckCmakeCompat.cmake b/cmake/CheckCmakeCompat.cmake index 8568454de..fd746442e 100644 --- a/cmake/CheckCmakeCompat.cmake +++ b/cmake/CheckCmakeCompat.cmake @@ -22,7 +22,8 @@ macro(enable_cmake_compat CMVERSION) endif() endmacro() -# Compatibility includes - oder does matter! +# Compatibility includes - order does matter! +enable_cmake_compat(2.8.11) enable_cmake_compat(2.8.6) enable_cmake_compat(2.8.3) enable_cmake_compat(2.8.2) diff --git a/cmake/compat_2.8.11/BasicConfigVersion-AnyNewerVersion.cmake.in b/cmake/compat_2.8.11/BasicConfigVersion-AnyNewerVersion.cmake.in new file mode 100644 index 000000000..b1c4fdf81 --- /dev/null +++ b/cmake/compat_2.8.11/BasicConfigVersion-AnyNewerVersion.cmake.in @@ -0,0 +1,31 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version. +# The variable CVF_VERSION must be set before calling configure_file(). + +set(PACKAGE_VERSION "@CVF_VERSION@") + +if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" ) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if( "${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "@CMAKE_SIZEOF_VOID_P@" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT "${CMAKE_SIZEOF_VOID_P}" STREQUAL "@CMAKE_SIZEOF_VOID_P@") + math(EXPR installedBits "@CMAKE_SIZEOF_VOID_P@ * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/cmake/compat_2.8.11/BasicConfigVersion-ExactVersion.cmake.in b/cmake/compat_2.8.11/BasicConfigVersion-ExactVersion.cmake.in new file mode 100644 index 000000000..63f3f0339 --- /dev/null +++ b/cmake/compat_2.8.11/BasicConfigVersion-ExactVersion.cmake.in @@ -0,0 +1,47 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is equal to the requested version. +# The tweak version component is ignored. +# The variable CVF_VERSION must be set before calling configure_file(). + + +set(PACKAGE_VERSION "@CVF_VERSION@") + +if("@CVF_VERSION@" MATCHES "^([0-9]+\\.[0-9]+\\.[0-9]+)\\..*") # strip the tweak version + set(CVF_VERSION_NO_TWEAK "${CMAKE_MATCH_1}") +else() + set(CVF_VERSION_NO_TWEAK "@CVF_VERSION@") +endif() + +if("${PACKAGE_FIND_VERSION}" MATCHES "^([0-9]+\\.[0-9]+\\.[0-9]+)\\..*") # strip the tweak version + set(REQUESTED_VERSION_NO_TWEAK "${CMAKE_MATCH_1}") +else() + set(REQUESTED_VERSION_NO_TWEAK "${PACKAGE_FIND_VERSION}") +endif() + +if("${REQUESTED_VERSION_NO_TWEAK}" STREQUAL "${CVF_VERSION_NO_TWEAK}") + set(PACKAGE_VERSION_COMPATIBLE TRUE) +else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) +endif() + +if( "${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) +endif() + + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "@CMAKE_SIZEOF_VOID_P@" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT "${CMAKE_SIZEOF_VOID_P}" STREQUAL "@CMAKE_SIZEOF_VOID_P@") + math(EXPR installedBits "@CMAKE_SIZEOF_VOID_P@ * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/cmake/compat_2.8.11/BasicConfigVersion-SameMajorVersion.cmake.in b/cmake/compat_2.8.11/BasicConfigVersion-SameMajorVersion.cmake.in new file mode 100644 index 000000000..4acd9bb5e --- /dev/null +++ b/cmake/compat_2.8.11/BasicConfigVersion-SameMajorVersion.cmake.in @@ -0,0 +1,46 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version, +# but only if the requested major version is the same as the current one. +# The variable CVF_VERSION must be set before calling configure_file(). + + +set(PACKAGE_VERSION "@CVF_VERSION@") + +if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" ) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + + if("@CVF_VERSION@" MATCHES "^([0-9]+)\\.") + set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}") + else() + set(CVF_VERSION_MAJOR "@CVF_VERSION@") + endif() + + if("${PACKAGE_FIND_VERSION_MAJOR}" STREQUAL "${CVF_VERSION_MAJOR}") + set(PACKAGE_VERSION_COMPATIBLE TRUE) + else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) + endif() + + if( "${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() + + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "@CMAKE_SIZEOF_VOID_P@" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT "${CMAKE_SIZEOF_VOID_P}" STREQUAL "@CMAKE_SIZEOF_VOID_P@") + math(EXPR installedBits "@CMAKE_SIZEOF_VOID_P@ * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/cmake/compat_2.8.11/CMakePackageConfigHelpers.cmake b/cmake/compat_2.8.11/CMakePackageConfigHelpers.cmake new file mode 100644 index 000000000..d042d5e0f --- /dev/null +++ b/cmake/compat_2.8.11/CMakePackageConfigHelpers.cmake @@ -0,0 +1,248 @@ +# - CONFIGURE_PACKAGE_CONFIG_FILE(), WRITE_BASIC_PACKAGE_VERSION_FILE() +# +# CONFIGURE_PACKAGE_CONFIG_FILE( INSTALL_DESTINATION +# [PATH_VARS ... ] +# [NO_SET_AND_CHECK_MACRO] +# [NO_CHECK_REQUIRED_COMPONENTS_MACRO]) +# +# CONFIGURE_PACKAGE_CONFIG_FILE() should be used instead of the plain +# configure_file() command when creating the Config.cmake or -config.cmake +# file for installing a project or library. It helps making the resulting package +# relocatable by avoiding hardcoded paths in the installed Config.cmake file. +# +# In a FooConfig.cmake file there may be code like this to make the +# install destinations know to the using project: +# set(FOO_INCLUDE_DIR "@CMAKE_INSTALL_FULL_INCLUDEDIR@" ) +# set(FOO_DATA_DIR "@CMAKE_INSTALL_PREFIX@/@RELATIVE_DATA_INSTALL_DIR@" ) +# set(FOO_ICONS_DIR "@CMAKE_INSTALL_PREFIX@/share/icons" ) +# ...logic to determine installedPrefix from the own location... +# set(FOO_CONFIG_DIR "${installedPrefix}/@CONFIG_INSTALL_DIR@" ) +# All 4 options shown above are not sufficient, since the first 3 hardcode +# the absolute directory locations, and the 4th case works only if the logic +# to determine the installedPrefix is correct, and if CONFIG_INSTALL_DIR contains +# a relative path, which in general cannot be guaranteed. +# This has the effect that the resulting FooConfig.cmake file would work poorly +# under Windows and OSX, where users are used to choose the install location +# of a binary package at install time, independent from how CMAKE_INSTALL_PREFIX +# was set at build/cmake time. +# +# Using CONFIGURE_PACKAGE_CONFIG_FILE() helps. If used correctly, it makes the +# resulting FooConfig.cmake file relocatable. +# Usage: +# 1. write a FooConfig.cmake.in file as you are used to +# 2. insert a line containing only the string "@PACKAGE_INIT@" +# 3. instead of set(FOO_DIR "@SOME_INSTALL_DIR@"), use set(FOO_DIR "@PACKAGE_SOME_INSTALL_DIR@") +# (this must be after the @PACKAGE_INIT@ line) +# 4. instead of using the normal configure_file(), use CONFIGURE_PACKAGE_CONFIG_FILE() +# +# The and arguments are the input and output file, the same way +# as in configure_file(). +# +# The given to INSTALL_DESTINATION must be the destination where the FooConfig.cmake +# file will be installed to. This can either be a relative or absolute path, both work. +# +# The variables to given as PATH_VARS are the variables which contain +# install destinations. For each of them the macro will create a helper variable +# PACKAGE_. These helper variables must be used +# in the FooConfig.cmake.in file for setting the installed location. They are calculated +# by CONFIGURE_PACKAGE_CONFIG_FILE() so that they are always relative to the +# installed location of the package. This works both for relative and also for absolute locations. +# For absolute locations it works only if the absolute location is a subdirectory +# of CMAKE_INSTALL_PREFIX. +# +# By default configure_package_config_file() also generates two helper macros, +# set_and_check() and check_required_components() into the FooConfig.cmake file. +# +# set_and_check() should be used instead of the normal set() +# command for setting directories and file locations. Additionally to setting the +# variable it also checks that the referenced file or directory actually exists +# and fails with a FATAL_ERROR otherwise. This makes sure that the created +# FooConfig.cmake file does not contain wrong references. +# When using the NO_SET_AND_CHECK_MACRO, this macro is not generated into the +# FooConfig.cmake file. +# +# check_required_components() should be called at the end of the +# FooConfig.cmake file if the package supports components. +# This macro checks whether all requested, non-optional components have been found, +# and if this is not the case, sets the Foo_FOUND variable to FALSE, so that the package +# is considered to be not found. +# It does that by testing the Foo__FOUND variables for all requested +# required components. +# When using the NO_CHECK_REQUIRED_COMPONENTS option, this macro is not generated +# into the FooConfig.cmake file. +# +# For an example see below the documentation for WRITE_BASIC_PACKAGE_VERSION_FILE(). +# +# +# WRITE_BASIC_PACKAGE_VERSION_FILE( filename VERSION major.minor.patch COMPATIBILITY (AnyNewerVersion|SameMajorVersion|ExactVersion) ) +# +# Writes a file for use as ConfigVersion.cmake file to . +# See the documentation of find_package() for details on this. +# filename is the output filename, it should be in the build tree. +# major.minor.patch is the version number of the project to be installed +# The COMPATIBILITY mode AnyNewerVersion means that the installed package version +# will be considered compatible if it is newer or exactly the same as the requested version. +# This mode should be used for packages which are fully backward compatible, +# also across major versions. +# If SameMajorVersion is used instead, then the behaviour differs from AnyNewerVersion +# in that the major version number must be the same as requested, e.g. version 2.0 will +# not be considered compatible if 1.0 is requested. +# This mode should be used for packages which guarantee backward compatibility within the +# same major version. +# If ExactVersion is used, then the package is only considered compatible if the requested +# version matches exactly its own version number (not considering the tweak version). +# For example, version 1.2.3 of a package is only considered compatible to requested version 1.2.3. +# This mode is for packages without compatibility guarantees. +# If your project has more elaborated version matching rules, you will need to write your +# own custom ConfigVersion.cmake file instead of using this macro. +# +# Internally, this macro executes configure_file() to create the resulting +# version file. Depending on the COMPATIBLITY, either the file +# BasicConfigVersion-SameMajorVersion.cmake.in or BasicConfigVersion-AnyNewerVersion.cmake.in +# is used. Please note that these two files are internal to CMake and you should +# not call configure_file() on them yourself, but they can be used as starting +# point to create more sophisticted custom ConfigVersion.cmake files. +# +# +# Example using both configure_package_config_file() and write_basic_package_version_file(): +# CMakeLists.txt: +# set(INCLUDE_INSTALL_DIR include/ ... CACHE ) +# set(LIB_INSTALL_DIR lib/ ... CACHE ) +# set(SYSCONFIG_INSTALL_DIR etc/foo/ ... CACHE ) +# ... +# include(CMakePackageConfigHelpers) +# configure_package_config_file(FooConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake +# INSTALL_DESTINATION ${LIB_INSTALL_DIR}/Foo/cmake +# PATH_VARS INCLUDE_INSTALL_DIR SYSCONFIG_INSTALL_DIR) +# write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake +# VERSION 1.2.3 +# COMPATIBILITY SameMajorVersion ) +# install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake +# DESTINATION ${LIB_INSTALL_DIR}/Foo/cmake ) +# +# With a FooConfig.cmake.in: +# set(FOO_VERSION x.y.z) +# ... +# @PACKAGE_INIT@ +# ... +# set_and_check(FOO_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") +# set_and_check(FOO_SYSCONFIG_DIR "@PACKAGE_SYSCONFIG_INSTALL_DIR@") +# +# check_required_components(Foo) + + +#============================================================================= +# Copyright 2012 Alexander Neundorf +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +include(CMakeParseArguments) + +include(WriteBasicConfigVersionFile) + +macro(WRITE_BASIC_PACKAGE_VERSION_FILE) + write_basic_config_version_file(${ARGN}) +endmacro() + + +function(CONFIGURE_PACKAGE_CONFIG_FILE _inputFile _outputFile) + set(options NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO) + set(oneValueArgs INSTALL_DESTINATION ) + set(multiValueArgs PATH_VARS ) + + cmake_parse_arguments(CCF "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(CCF_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to CONFIGURE_PACKAGE_CONFIG_FILE(): \"${CCF_UNPARSED_ARGUMENTS}\"") + endif() + + if(NOT CCF_INSTALL_DESTINATION) + message(FATAL_ERROR "No INSTALL_DESTINATION given to CONFIGURE_PACKAGE_CONFIG_FILE()") + endif() + + if(IS_ABSOLUTE "${CCF_INSTALL_DESTINATION}") + set(absInstallDir "${CCF_INSTALL_DESTINATION}") + else() + set(absInstallDir "${CMAKE_INSTALL_PREFIX}/${CCF_INSTALL_DESTINATION}") + endif() + + file(RELATIVE_PATH PACKAGE_RELATIVE_PATH "${absInstallDir}" "${CMAKE_INSTALL_PREFIX}" ) + + foreach(var ${CCF_PATH_VARS}) + if(NOT DEFINED ${var}) + message(FATAL_ERROR "Variable ${var} does not exist") + else() + if(IS_ABSOLUTE "${${var}}") + string(REPLACE "${CMAKE_INSTALL_PREFIX}" "\${PACKAGE_PREFIX_DIR}" + PACKAGE_${var} "${${var}}") + else() + set(PACKAGE_${var} "\${PACKAGE_PREFIX_DIR}/${${var}}") + endif() + endif() + endforeach() + + get_filename_component(inputFileName "${_inputFile}" NAME) + + set(PACKAGE_INIT " +####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() ####### +####### Any changes to this file will be overwritten by the next CMake run #### +####### The input file was ${inputFileName} ######## + +get_filename_component(PACKAGE_PREFIX_DIR \"\${CMAKE_CURRENT_LIST_DIR}/${PACKAGE_RELATIVE_PATH}\" ABSOLUTE) +") + + if("${absInstallDir}" MATCHES "^(/usr)?/lib(64)?/.+") + # Handle "/usr move" symlinks created by some Linux distros. + set(PACKAGE_INIT "${PACKAGE_INIT} +# Use original install prefix when loaded through a \"/usr move\" +# cross-prefix symbolic link such as /lib -> /usr/lib. +get_filename_component(_realCurr \"\${CMAKE_CURRENT_LIST_DIR}\" REALPATH) +get_filename_component(_realOrig \"${absInstallDir}\" REALPATH) +if(_realCurr STREQUAL _realOrig) + set(PACKAGE_PREFIX_DIR \"${CMAKE_INSTALL_PREFIX}\") +endif() +unset(_realOrig) +unset(_realCurr) +") + endif() + + if(NOT CCF_NO_SET_AND_CHECK_MACRO) + set(PACKAGE_INIT "${PACKAGE_INIT} +macro(set_and_check _var _file) + set(\${_var} \"\${_file}\") + if(NOT EXISTS \"\${_file}\") + message(FATAL_ERROR \"File or directory \${_file} referenced by variable \${_var} does not exist !\") + endif() +endmacro() +") + endif() + + + if(NOT CCF_NO_CHECK_REQUIRED_COMPONENTS_MACRO) + set(PACKAGE_INIT "${PACKAGE_INIT} +macro(check_required_components _NAME) + foreach(comp \${\${_NAME}_FIND_COMPONENTS}) + if(NOT \${_NAME}_\${comp}_FOUND) + if(\${_NAME}_FIND_REQUIRED_\${comp}) + set(\${_NAME}_FOUND FALSE) + endif() + endif() + endforeach() +endmacro() +") + endif() + + set(PACKAGE_INIT "${PACKAGE_INIT} +####################################################################################") + + configure_file("${_inputFile}" "${_outputFile}" @ONLY) + +endfunction() diff --git a/cmake/compat_2.8.11/WriteBasicConfigVersionFile.cmake b/cmake/compat_2.8.11/WriteBasicConfigVersionFile.cmake new file mode 100644 index 000000000..6e0268ae3 --- /dev/null +++ b/cmake/compat_2.8.11/WriteBasicConfigVersionFile.cmake @@ -0,0 +1,50 @@ +# WRITE_BASIC_CONFIG_VERSION_FILE( filename VERSION major.minor.patch COMPATIBILITY (AnyNewerVersion|SameMajorVersion) ) +# +# Deprecated, see WRITE_BASIC_PACKAGE_VERSION_FILE(), it is identical. + +#============================================================================= +# Copyright 2008-2011 Alexander Neundorf, +# Copyright 2004-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +include(CMakeParseArguments) + +function(WRITE_BASIC_CONFIG_VERSION_FILE _filename) + + set(options ) + set(oneValueArgs VERSION COMPATIBILITY ) + set(multiValueArgs ) + + cmake_parse_arguments(CVF "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(CVF_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to WRITE_BASIC_CONFIG_VERSION_FILE(): \"${CVF_UNPARSED_ARGUMENTS}\"") + endif() + + foreach(MODULE_PATH ${CMAKE_MODULE_PATH}) + if (${MODULE_PATH} MATCHES "compat_2.8.11") + set(CURRENT_MODULE_PATH ${MODULE_PATH}) + endif() + endforeach() + + set(versionTemplateFile "${CURRENT_MODULE_PATH}/BasicConfigVersion-${CVF_COMPATIBILITY}.cmake.in") + if(NOT EXISTS "${versionTemplateFile}") + message(FATAL_ERROR "Bad COMPATIBILITY value used for WRITE_BASIC_CONFIG_VERSION_FILE(): \"${CVF_COMPATIBILITY}\"") + endif() + + if("${CVF_VERSION}" STREQUAL "") + message(FATAL_ERROR "No VERSION specified for WRITE_BASIC_CONFIG_VERSION_FILE()") + endif() + + configure_file("${versionTemplateFile}" "${_filename}" @ONLY) + +endfunction() diff --git a/server/common/CMakeLists.txt b/server/common/CMakeLists.txt index d0fc89f59..f1fbf9cec 100644 --- a/server/common/CMakeLists.txt +++ b/server/common/CMakeLists.txt @@ -39,6 +39,6 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries) +install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries EXPORT FreeRDPTargets) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Server/Common") diff --git a/winpr/CMakeLists.txt b/winpr/CMakeLists.txt index 2870b8943..f19fe984d 100644 --- a/winpr/CMakeLists.txt +++ b/winpr/CMakeLists.txt @@ -45,7 +45,7 @@ include(CheckCCompilerFlag) include(GNUInstallDirsWrapper) # Soname versioning -set(WINPR_VERSION_MAJOR "0") +set(WINPR_VERSION_MAJOR "1") set(WINPR_VERSION_MINOR "1") set(WINPR_VERSION_REVISION "0") set(WINPR_VERSION "${WINPR_VERSION_MAJOR}.${WINPR_VERSION_MINOR}") @@ -82,18 +82,27 @@ endif() # Exporting -export(PACKAGE winpr) +if(${CMAKE_VERSION} VERSION_GREATER "2.8.10") -set(WINPR_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/WinPR/cmake") + export(PACKAGE winpr) -configure_package_config_file(WinPRConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfig.cmake - INSTALL_DESTINATION ${WINPR_CMAKE_INSTALL_DIR} - PATH_VARS CMAKE_INSTALL_INCLUDEDIR) + set(WINPR_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/WinPR/cmake") -write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/WinPRConfigVersion.cmake - VERSION ${WINPR_VERSION} COMPATIBILITY SameMajorVersion) + set(WINPR_INCLUDE_DIR "include") -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfigVersion.cmake - DESTINATION ${WINPR_CMAKE_INSTALL_DIR}) + message(STATUS "WINPR_VERSION: ${WINPR_VERSION}") + + configure_package_config_file(WinPRConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfig.cmake + INSTALL_DESTINATION ${WINPR_CMAKE_INSTALL_DIR} + PATH_VARS WINPR_INCLUDE_DIR) + + write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/WinPRConfigVersion.cmake + VERSION ${WINPR_VERSION} COMPATIBILITY SameMajorVersion) + + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfigVersion.cmake + DESTINATION ${WINPR_CMAKE_INSTALL_DIR}) + + install(EXPORT WinPRTargets DESTINATION ${WINPR_CMAKE_INSTALL_DIR}) + +endif() -install(EXPORT WinPRTargets DESTINATION ${WINPR_CMAKE_INSTALL_DIR}) diff --git a/winpr/WinPRConfig.cmake.in b/winpr/WinPRConfig.cmake.in index f3adb4def..edf8091dd 100644 --- a/winpr/WinPRConfig.cmake.in +++ b/winpr/WinPRConfig.cmake.in @@ -5,6 +5,6 @@ set(WinPR_VERSION_MAJOR "@WINPR_VERSION_MAJOR@") set(WinPR_VERSION_MINOR "@WINPR_VERSION_MINOR@") set(WinPR_VERSION_PATCH "@WINPR_VERSION_PATCH@") -set_and_check(WinPR_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") +set_and_check(WinPR_INCLUDE_DIR "@PACKAGE_WINPR_INCLUDE_DIR@") include("${CMAKE_CURRENT_LIST_DIR}/WinPRTargets.cmake") diff --git a/winpr/tools/makecert/CMakeLists.txt b/winpr/tools/makecert/CMakeLists.txt index 84386697a..ecfbbe1c4 100644 --- a/winpr/tools/makecert/CMakeLists.txt +++ b/winpr/tools/makecert/CMakeLists.txt @@ -38,7 +38,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) -install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries) +install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries EXPORT WinPRTargets) add_subdirectory(cli) From 3b0bcc98243a1cddf1b85b9b8205d7229202252b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Tue, 29 Oct 2013 15:16:44 -0400 Subject: [PATCH 20/40] cmake: export to different directory, export more build info --- CMakeLists.txt | 5 +++-- FreeRDPConfig.cmake.in | 3 ++- winpr/CMakeLists.txt | 5 +++-- winpr/WinPRConfig.cmake.in | 3 ++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a319b17d6..8dc1e2224 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -558,13 +558,14 @@ if(${CMAKE_VERSION} VERSION_GREATER "2.8.10") export(PACKAGE freerdp) - set(FREERDP_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/FreeRDP/cmake") + set(FREERDP_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/FreeRDP") set(FREERDP_INCLUDE_DIR "include") + set(FREERDP_MONOLITHIC_BUILD ${MONOLITHIC_BUILD}) configure_package_config_file(FreeRDPConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfig.cmake INSTALL_DESTINATION ${FREERDP_CMAKE_INSTALL_DIR} - PATH_VARS FREERDP_INCLUDE_DIR) + PATH_VARS FREERDP_INCLUDE_DIR FREERDP_MONOLITHIC_BUILD) write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FreeRDPConfigVersion.cmake VERSION ${FREERDP_VERSION} COMPATIBILITY SameMajorVersion) diff --git a/FreeRDPConfig.cmake.in b/FreeRDPConfig.cmake.in index 9b8f9b9a8..7dcea99de 100644 --- a/FreeRDPConfig.cmake.in +++ b/FreeRDPConfig.cmake.in @@ -3,7 +3,8 @@ set(FreeRDP_VERSION_MAJOR "@FREERDP_VERSION_MAJOR@") set(FreeRDP_VERSION_MINOR "@FREERDP_VERSION_MINOR@") -set(FreeRDP_VERSION_PATCH "@FREERDP_VERSION_PATCH@") +set(FreeRDP_VERSION_REVISION "@FREERDP_VERSION_REVISION@") +set(FreeRDP_MONOLITHIC_BUILD "@FREERDP_MONOLITHIC_BUILD@") set_and_check(FreeRDP_INCLUDE_DIR "@PACKAGE_FREERDP_INCLUDE_DIR@") diff --git a/winpr/CMakeLists.txt b/winpr/CMakeLists.txt index f19fe984d..c20a307c6 100644 --- a/winpr/CMakeLists.txt +++ b/winpr/CMakeLists.txt @@ -86,15 +86,16 @@ if(${CMAKE_VERSION} VERSION_GREATER "2.8.10") export(PACKAGE winpr) - set(WINPR_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/WinPR/cmake") + set(WINPR_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/WinPR") set(WINPR_INCLUDE_DIR "include") + set(WINPR_MONOLITHIC_BUILD ${MONOLITHIC_BUILD}) message(STATUS "WINPR_VERSION: ${WINPR_VERSION}") configure_package_config_file(WinPRConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/WinPRConfig.cmake INSTALL_DESTINATION ${WINPR_CMAKE_INSTALL_DIR} - PATH_VARS WINPR_INCLUDE_DIR) + PATH_VARS WINPR_INCLUDE_DIR WINPR_MONOLITHIC_BUILD) write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/WinPRConfigVersion.cmake VERSION ${WINPR_VERSION} COMPATIBILITY SameMajorVersion) diff --git a/winpr/WinPRConfig.cmake.in b/winpr/WinPRConfig.cmake.in index edf8091dd..3a7a6c005 100644 --- a/winpr/WinPRConfig.cmake.in +++ b/winpr/WinPRConfig.cmake.in @@ -3,7 +3,8 @@ set(WinPR_VERSION_MAJOR "@WINPR_VERSION_MAJOR@") set(WinPR_VERSION_MINOR "@WINPR_VERSION_MINOR@") -set(WinPR_VERSION_PATCH "@WINPR_VERSION_PATCH@") +set(WinPR_VERSION_REVISION "@WINPR_VERSION_REVISION@") +set(WinPR_MONOLITHIC_BUILD "@WINPR_MONOLITHIC_BUILD@") set_and_check(WinPR_INCLUDE_DIR "@PACKAGE_WINPR_INCLUDE_DIR@") From 938d423ec9ee6a63c192fcb13e33013ad748dfd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 30 Oct 2013 17:56:44 -0400 Subject: [PATCH 21/40] freerdp: fix build on Windows --- libfreerdp/core/nla.c | 13 +++++--- .../test/TestEnvironmentGetSetEB.c | 33 +++++++++++-------- .../TestEnvironmentMergeEnvironmentStrings.c | 4 +-- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/libfreerdp/core/nla.c b/libfreerdp/core/nla.c index 3bc9cbc2d..9fa35b42b 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -113,6 +113,7 @@ int credssp_ntlm_client_init(rdpCredssp* credssp) { char* spn; int length; + rdpTls* tls = NULL; freerdp* instance; rdpSettings* settings; @@ -138,12 +139,16 @@ int credssp_ntlm_client_init(rdpCredssp* credssp) (char*) credssp->identity.User, (char*) credssp->identity.Domain, (char*) credssp->identity.Password); #endif - rdpTls *tls = NULL; - if(credssp->transport->layer == TRANSPORT_LAYER_TLS) { + if (credssp->transport->layer == TRANSPORT_LAYER_TLS) + { tls = credssp->transport->TlsIn; - } else if(credssp->transport->layer == TRANSPORT_LAYER_TSG_TLS) { + } + else if (credssp->transport->layer == TRANSPORT_LAYER_TSG_TLS) + { tls = credssp->transport->TsgTls; - } else { + } + else + { fprintf(stderr, "Unknown NLA transport layer\n"); return 0; } diff --git a/winpr/libwinpr/environment/test/TestEnvironmentGetSetEB.c b/winpr/libwinpr/environment/test/TestEnvironmentGetSetEB.c index 0420e8881..dbf248a6a 100644 --- a/winpr/libwinpr/environment/test/TestEnvironmentGetSetEB.c +++ b/winpr/libwinpr/environment/test/TestEnvironmentGetSetEB.c @@ -6,6 +6,7 @@ int TestEnvironmentGetSetEB(int argc, char* argv[]) { +#ifndef _WIN32 char test[1024]; TCHAR* p; int length; @@ -17,7 +18,6 @@ int TestEnvironmentGetSetEB(int argc, char* argv[]) p = (LPSTR) malloc(length); length = GetEnvironmentVariableEBA(lpszEnvironmentBlock,"DISPLAY", p, length); - printf("GetEnvironmentVariableA(WINPR_TEST_VARIABLE) = %s\n" , p); if (strcmp(p, "WINPR_TEST_VALUE") != 0) @@ -27,35 +27,40 @@ int TestEnvironmentGetSetEB(int argc, char* argv[]) free(p); - lpszEnvironmentBlockNew = (LPTCH)malloc(1024); + lpszEnvironmentBlockNew = (LPTCH) malloc(1024); memcpy(lpszEnvironmentBlockNew,lpszEnvironmentBlock,56); - if (SetEnvironmentVariableEBA(&lpszEnvironmentBlockNew,"test","5") ) { - - if (GetEnvironmentVariableEBA(lpszEnvironmentBlockNew,"test", test, 1023) ) { - if (strcmp(test,"5") != 0) { + if (SetEnvironmentVariableEBA(&lpszEnvironmentBlockNew, "test", "5")) + { + if (GetEnvironmentVariableEBA(lpszEnvironmentBlockNew,"test", test, 1023)) + { + if (strcmp(test,"5") != 0) + { return -1; } - } else { + } + else + { return -1; } } //free(lpszEnvironmentBlockNew); - if (SetEnvironmentVariableEBA(&lpszEnvironmentBlockNew,"test",NULL) ) { - - if (GetEnvironmentVariableEBA(lpszEnvironmentBlockNew,"test", test, 1023) ) { + if (SetEnvironmentVariableEBA(&lpszEnvironmentBlockNew, "test", NULL)) + { + if (GetEnvironmentVariableEBA(lpszEnvironmentBlockNew,"test", test, 1023)) + { return -1; - } else { + } + else + { // not found .. this is expected } } free(lpszEnvironmentBlockNew); - - - +#endif return 0; } diff --git a/winpr/libwinpr/environment/test/TestEnvironmentMergeEnvironmentStrings.c b/winpr/libwinpr/environment/test/TestEnvironmentMergeEnvironmentStrings.c index 15a243285..dca201137 100644 --- a/winpr/libwinpr/environment/test/TestEnvironmentMergeEnvironmentStrings.c +++ b/winpr/libwinpr/environment/test/TestEnvironmentMergeEnvironmentStrings.c @@ -6,6 +6,7 @@ int TestEnvironmentMergeEnvironmentStrings(int argc, char* argv[]) { +#ifndef _WIN32 TCHAR* p; int length; LPTCH lpszEnvironmentBlock; @@ -17,8 +18,6 @@ int TestEnvironmentMergeEnvironmentStrings(int argc, char* argv[]) p = (TCHAR*) lpszMergedEnvironmentBlock; - - while (p[0] && p[1]) { printf("%s\n", p); @@ -27,6 +26,7 @@ int TestEnvironmentMergeEnvironmentStrings(int argc, char* argv[]) } FreeEnvironmentStrings(lpszEnvironmentBlock); +#endif return 0; } From 8a64934c7b6533dae3c77ff613cb0767a76cbc00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 31 Oct 2013 11:02:25 -0400 Subject: [PATCH 22/40] libwinpr-io: start device file implementation --- include/freerdp/channels/rdpdr.h | 14 +- winpr/include/winpr/io.h | 82 +++++++++++ winpr/libwinpr/io/CMakeLists.txt | 9 +- winpr/libwinpr/io/device.c | 201 ++++++++++++++++++++++++++ winpr/libwinpr/io/io.h | 40 +++++ winpr/libwinpr/io/test/CMakeLists.txt | 1 + winpr/libwinpr/io/test/TestIoDevice.c | 28 ++++ 7 files changed, 369 insertions(+), 6 deletions(-) create mode 100644 winpr/libwinpr/io/device.c create mode 100644 winpr/libwinpr/io/io.h create mode 100644 winpr/libwinpr/io/test/TestIoDevice.c diff --git a/include/freerdp/channels/rdpdr.h b/include/freerdp/channels/rdpdr.h index 7b80db1a4..b6fbbbccb 100644 --- a/include/freerdp/channels/rdpdr.h +++ b/include/freerdp/channels/rdpdr.h @@ -22,6 +22,7 @@ #define FREERDP_CHANNEL_RDPDR_H #include +#include #include #include #include @@ -262,11 +263,14 @@ enum FSCTL_STRUCTURE #endif /* [MS-FSCC] FileFsDeviceInformation.DeviceType */ -enum FILE_FS_DEVICE_TYPE -{ - FILE_DEVICE_CD_ROM = 0x00000002, - FILE_DEVICE_DISK = 0x00000007 -}; + +#ifndef FILE_DEVICE_CD_ROM +#define FILE_DEVICE_CD_ROM 0x00000002 +#endif + +#ifndef FILE_DEVICE_DISK +#define FILE_DEVICE_DISK 0x00000007 +#endif /* [MS-FSCC] FileFsDeviceInformation.Characteristics */ enum FILE_FS_DEVICE_FLAG diff --git a/winpr/include/winpr/io.h b/winpr/include/winpr/io.h index 52d94ed17..f0ce89ed6 100644 --- a/winpr/include/winpr/io.h +++ b/winpr/include/winpr/io.h @@ -82,6 +82,88 @@ WINPR_API BOOL CancelSynchronousIo(HANDLE hThread); } #endif +/* + * WinPR I/O Manager Custom API + */ + +#define DEVICE_TYPE ULONG + +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define FILE_DEVICE_SMB 0x0000002e +#define FILE_DEVICE_KS 0x0000002f +#define FILE_DEVICE_CHANGER 0x00000030 +#define FILE_DEVICE_SMARTCARD 0x00000031 +#define FILE_DEVICE_ACPI 0x00000032 +#define FILE_DEVICE_DVD 0x00000033 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 +#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 +#define FILE_DEVICE_DFS_VOLUME 0x00000036 +#define FILE_DEVICE_SERENUM 0x00000037 +#define FILE_DEVICE_TERMSRV 0x00000038 +#define FILE_DEVICE_KSEC 0x00000039 +#define FILE_DEVICE_FIPS 0x0000003A +#define FILE_DEVICE_INFINIBAND 0x0000003B +#define FILE_DEVICE_VMBUS 0x0000003E +#define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F +#define FILE_DEVICE_WPD 0x00000040 +#define FILE_DEVICE_BLUETOOTH 0x00000041 +#define FILE_DEVICE_MT_COMPOSITE 0x00000042 +#define FILE_DEVICE_MT_TRANSPORT 0x00000043 +#define FILE_DEVICE_BIOMETRIC 0x00000044 +#define FILE_DEVICE_PMI 0x00000045 + +typedef HANDLE PDRIVER_OBJECT_EX; +typedef HANDLE PDEVICE_OBJECT_EX; + +WINPR_API NTSTATUS _IoCreateDeviceEx(PDRIVER_OBJECT_EX DriverObject, ULONG DeviceExtensionSize, PUNICODE_STRING DeviceName, + DEVICE_TYPE DeviceType, ULONG DeviceCharacteristics, BOOLEAN Exclusive, PDEVICE_OBJECT_EX* DeviceObject); + +WINPR_API VOID _IoDeleteDeviceEx(PDEVICE_OBJECT_EX DeviceObject); + #endif #endif /* WINPR_IO_H */ diff --git a/winpr/libwinpr/io/CMakeLists.txt b/winpr/libwinpr/io/CMakeLists.txt index 58041b4a3..f913bd4a7 100644 --- a/winpr/libwinpr/io/CMakeLists.txt +++ b/winpr/libwinpr/io/CMakeLists.txt @@ -19,7 +19,9 @@ set(MODULE_NAME "winpr-io") set(MODULE_PREFIX "WINPR_IO") set(${MODULE_PREFIX}_SRCS - io.c) + device.c + io.c + io.h) if(MSVC AND (NOT MONOLITHIC_BUILD)) set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} module.def) @@ -31,6 +33,11 @@ add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") +set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS + MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL + MODULE winpr + MODULES winpr-crt winpr-path) + if(MONOLITHIC_BUILD) else() diff --git a/winpr/libwinpr/io/device.c b/winpr/libwinpr/io/device.c new file mode 100644 index 000000000..15ef9d22a --- /dev/null +++ b/winpr/libwinpr/io/device.c @@ -0,0 +1,201 @@ +/** + * WinPR: Windows Portable Runtime + * Asynchronous I/O Functions + * + * Copyright 2012 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#ifndef _WIN32 + +#include "io.h" + +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#include + +#include +#include +#include + +/** + * I/O Manager Routines + * http://msdn.microsoft.com/en-us/library/windows/hardware/ff551797/ + * + * These routines are only accessible to kernel drivers, but we need + * similar functionality in WinPR in user space. + * + * This is a best effort non-conflicting port of this API meant for + * non-Windows, WinPR usage only. + * + * References: + * + * Device Objects and Device Stacks: + * http://msdn.microsoft.com/en-us/library/windows/hardware/ff543153/ + * + * Driver Development Part 1: Introduction to Drivers: + * http://www.codeproject.com/Articles/9504/Driver-Development-Part-1-Introduction-to-Drivers/ + */ + +#define DEVICE_FILE_PREFIX_PATH "\\Device\\" + +char* GetDeviceFileNameWithoutPrefixA(LPCSTR lpName) +{ + char* lpFileName; + + if (!lpName) + return NULL; + + if (strncmp(lpName, DEVICE_FILE_PREFIX_PATH, sizeof(DEVICE_FILE_PREFIX_PATH) - 1) != 0) + return NULL; + + lpFileName = _strdup(&lpName[strlen(DEVICE_FILE_PREFIX_PATH)]); + + return lpFileName; +} + +char* GetDeviceFileUnixDomainSocketBaseFilePathA() +{ + char* lpTempPath; + char* lpPipePath; + + lpTempPath = GetKnownPath(KNOWN_PATH_TEMP); + lpPipePath = GetCombinedPath(lpTempPath, ".device"); + + free(lpTempPath); + + return lpPipePath; +} + +char* GetDeviceFileUnixDomainSocketFilePathA(LPCSTR lpName) +{ + char* lpPipePath; + char* lpFileName; + char* lpFilePath; + + lpPipePath = GetDeviceFileUnixDomainSocketBaseFilePathA(); + + lpFileName = GetDeviceFileNameWithoutPrefixA(lpName); + lpFilePath = GetCombinedPath(lpPipePath, (char*) lpFileName); + + free(lpPipePath); + free(lpFileName); + + return lpFilePath; +} + +/** + * IoCreateDevice: + * http://msdn.microsoft.com/en-us/library/windows/hardware/ff548397/ + */ + +NTSTATUS _IoCreateDeviceEx(PDRIVER_OBJECT_EX DriverObject, ULONG DeviceExtensionSize, PUNICODE_STRING DeviceName, + DEVICE_TYPE DeviceType, ULONG DeviceCharacteristics, BOOLEAN Exclusive, PDEVICE_OBJECT_EX* DeviceObject) +{ + int status; + char* DeviceBasePath; + DEVICE_OBJECT_EX* pDeviceObjectEx; + + DeviceBasePath = GetDeviceFileUnixDomainSocketBaseFilePathA(); + + if (!PathFileExistsA(DeviceBasePath)) + { + if (!mkdir(DeviceBasePath, S_IRUSR | S_IWUSR | S_IXUSR)) + { + free(DeviceBasePath); + return STATUS_ACCESS_DENIED; + } + } + + pDeviceObjectEx = (DEVICE_OBJECT_EX*) malloc(sizeof(DEVICE_OBJECT_EX)); + + if (!pDeviceObjectEx) + { + return STATUS_NO_MEMORY; + } + + ZeroMemory(pDeviceObjectEx, sizeof(DEVICE_OBJECT_EX)); + + ConvertFromUnicode(CP_UTF8, 0, DeviceName->Buffer, DeviceName->Length / 2, &(pDeviceObjectEx->DeviceName), 0, NULL, NULL); + + pDeviceObjectEx->DeviceFileName = GetDeviceFileUnixDomainSocketFilePathA(pDeviceObjectEx->DeviceName); + + if (PathFileExistsA(pDeviceObjectEx->DeviceFileName)) + { + unlink(pDeviceObjectEx->DeviceFileName); + } + + status = mkfifo(pDeviceObjectEx->DeviceFileName, 0666); + + *((ULONG_PTR*) (DeviceObject)) = (ULONG_PTR) pDeviceObjectEx; + + return STATUS_SUCCESS; +} + +/** + * IoDeleteDevice: + * http://msdn.microsoft.com/en-us/library/windows/hardware/ff549083/ + */ + +VOID _IoDeleteDeviceEx(PDEVICE_OBJECT_EX DeviceObject) +{ + DEVICE_OBJECT_EX* pDeviceObjectEx; + + pDeviceObjectEx = (DEVICE_OBJECT_EX*) DeviceObject; + + if (!pDeviceObjectEx) + return; + + unlink(pDeviceObjectEx->DeviceFileName); + + free(pDeviceObjectEx->DeviceName); + free(pDeviceObjectEx->DeviceFileName); + + free(pDeviceObjectEx); +} + +/** + * IoCreateSymbolicLink: + * http://msdn.microsoft.com/en-us/library/windows/hardware/ff549043/ + */ + +NTSTATUS _IoCreateSymbolicLinkEx(PUNICODE_STRING SymbolicLinkName, PUNICODE_STRING DeviceName) +{ + return STATUS_SUCCESS; +} + +/** + * IoDeleteSymbolicLink: + * http://msdn.microsoft.com/en-us/library/windows/hardware/ff549085/ + */ + +NTSTATUS _IoDeleteSymbolicLinkEx(PUNICODE_STRING SymbolicLinkName) +{ + return STATUS_SUCCESS; +} + +#endif diff --git a/winpr/libwinpr/io/io.h b/winpr/libwinpr/io/io.h new file mode 100644 index 000000000..d359bcf94 --- /dev/null +++ b/winpr/libwinpr/io/io.h @@ -0,0 +1,40 @@ +/** + * WinPR: Windows Portable Runtime + * Asynchronous I/O Functions + * + * Copyright 2012 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WINPR_IO_PRIVATE_H +#define WINPR_IO_PRIVATE_H + +#ifndef _WIN32 + +#include + +#include "../handle/handle.h" + +typedef struct _DEVICE_OBJECT_EX DEVICE_OBJECT_EX; + +struct _DEVICE_OBJECT_EX +{ + char* DeviceName; + char* DeviceFileName; +}; + +#endif + +#endif /* WINPR_IO_PRIVATE_H */ + diff --git a/winpr/libwinpr/io/test/CMakeLists.txt b/winpr/libwinpr/io/test/CMakeLists.txt index 401fe15ca..734f0b6fb 100644 --- a/winpr/libwinpr/io/test/CMakeLists.txt +++ b/winpr/libwinpr/io/test/CMakeLists.txt @@ -5,6 +5,7 @@ set(MODULE_PREFIX "TEST_IO") set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c) set(${MODULE_PREFIX}_TESTS + TestIoDevice.c TestIoGetOverlappedResult.c) create_test_sourcelist(${MODULE_PREFIX}_SRCS diff --git a/winpr/libwinpr/io/test/TestIoDevice.c b/winpr/libwinpr/io/test/TestIoDevice.c new file mode 100644 index 000000000..97d8ea80e --- /dev/null +++ b/winpr/libwinpr/io/test/TestIoDevice.c @@ -0,0 +1,28 @@ + +#include +#include +#include +#include + +int TestIoDevice(int argc, char* argv[]) +{ +#ifndef _WIN32 + NTSTATUS NtStatus; + ANSI_STRING aString; + UNICODE_STRING uString; + PDEVICE_OBJECT_EX pDeviceObject = NULL; + + _RtlInitAnsiString(&aString, "\\Device\\Example"); + _RtlAnsiStringToUnicodeString(&uString, &aString, TRUE); + + NtStatus = _IoCreateDeviceEx(NULL, 0, + &uString, FILE_DEVICE_UNKNOWN, + 0, FALSE, &pDeviceObject); + + _IoDeleteDeviceEx(pDeviceObject); + + _RtlFreeUnicodeString(&uString); +#endif + return 0; +} + From fd8355d47a9fe2f18557aaa85b0911ec047cb0c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 31 Oct 2013 17:19:46 -0400 Subject: [PATCH 23/40] libwinpr-io: add missing link dependency to libwinpr-nt --- winpr/libwinpr/io/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winpr/libwinpr/io/test/CMakeLists.txt b/winpr/libwinpr/io/test/CMakeLists.txt index 734f0b6fb..2de6e7ef7 100644 --- a/winpr/libwinpr/io/test/CMakeLists.txt +++ b/winpr/libwinpr/io/test/CMakeLists.txt @@ -17,7 +17,7 @@ add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} MODULE winpr - MODULES winpr-io) + MODULES winpr-io winpr-nt) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) From cdb8551dd0388fcb200c6ae50c18d7775750a5e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 31 Oct 2013 19:46:59 -0400 Subject: [PATCH 24/40] cmake: check for inclusion of FreeRDS --- server/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index a7c3ec233..e51b2c82a 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -35,8 +35,8 @@ else() add_subdirectory(Windows) endif() -if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/xrdp-ng") - add_subdirectory("xrdp-ng") +if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/FreeRDS") + add_subdirectory("FreeRDS") endif() # Pick up other clients From 3bc47a2bf83a75b072de5414679b81bf3eadc373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 31 Oct 2013 21:12:06 -0400 Subject: [PATCH 25/40] libfreerdp-core: fix leaks and potential use after free --- client/X11/xf_client.c | 58 ++++++++++++++++++----------------- client/common/client.c | 2 +- client/common/compatibility.c | 5 +++ libfreerdp/core/freerdp.c | 3 ++ libfreerdp/core/gateway/tsg.c | 14 ++++++--- 5 files changed, 49 insertions(+), 33 deletions(-) diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 8a29b2d5c..c586dbb58 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -750,13 +750,41 @@ BOOL xf_pre_connect(freerdp* instance) rdpSettings* settings; xfContext* xfc = (xfContext*) instance->context; - xfc->mutex = CreateMutex(NULL, FALSE, NULL); xfc->settings = instance->settings; xfc->instance = instance; settings = instance->settings; channels = instance->context->channels; + xfc->UseXThreads = TRUE; + + if (xfc->UseXThreads) + { + if (!XInitThreads()) + { + fprintf(stderr, "warning: XInitThreads() failure\n"); + xfc->UseXThreads = FALSE; + } + } + + xfc->display = XOpenDisplay(NULL); + + if (!xfc->display) + { + fprintf(stderr, "xf_pre_connect: failed to open display: %s\n", XDisplayName(NULL)); + fprintf(stderr, "Please check that the $DISPLAY environment variable is properly set.\n"); + return FALSE; + } + + if (xfc->debug) + { + fprintf(stderr, "Enabling X11 debug mode.\n"); + XSynchronize(xfc->display, TRUE); + _def_error_handler = XSetErrorHandler(_xf_error_handler); + } + + xfc->mutex = CreateMutex(NULL, FALSE, NULL); + PubSub_SubscribeChannelConnected(instance->context->pubSub, (pChannelConnectedEventHandler) xf_OnChannelConnectedEventHandler); @@ -785,33 +813,6 @@ BOOL xf_pre_connect(freerdp* instance) return TRUE; } - xfc->UseXThreads = TRUE; - - if (xfc->UseXThreads) - { - if (!XInitThreads()) - { - fprintf(stderr, "warning: XInitThreads() failure\n"); - xfc->UseXThreads = FALSE; - } - } - - xfc->display = XOpenDisplay(NULL); - - if (!xfc->display) - { - fprintf(stderr, "xf_pre_connect: failed to open display: %s\n", XDisplayName(NULL)); - fprintf(stderr, "Please check that the $DISPLAY environment variable is properly set.\n"); - return FALSE; - } - - if (xfc->debug) - { - fprintf(stderr, "Enabling X11 debug mode.\n"); - XSynchronize(xfc->display, TRUE); - _def_error_handler = XSetErrorHandler(_xf_error_handler); - } - xfc->_NET_WM_ICON = XInternAtom(xfc->display, "_NET_WM_ICON", False); xfc->_MOTIF_WM_HINTS = XInternAtom(xfc->display, "_MOTIF_WM_HINTS", False); xfc->_NET_CURRENT_DESKTOP = XInternAtom(xfc->display, "_NET_CURRENT_DESKTOP", False); @@ -1754,6 +1755,7 @@ static int xfreerdp_client_stop(rdpContext* context) xfContext* xfc = (xfContext*) context; assert(NULL != context); + if (context->settings->AsyncInput) { wMessageQueue* queue; diff --git a/client/common/client.c b/client/common/client.c index 926ea9889..f563f198d 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -70,12 +70,12 @@ rdpContext* freerdp_client_context_new(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) void freerdp_client_context_free(rdpContext* context) { freerdp* instance = context->instance; + if (instance) { freerdp_context_free(instance); free(instance->pClientEntryPoints); freerdp_free(instance); - context->instance = NULL; } } diff --git a/client/common/compatibility.c b/client/common/compatibility.c index 5fdd9ea3a..279706722 100644 --- a/client/common/compatibility.c +++ b/client/common/compatibility.c @@ -321,10 +321,15 @@ int freerdp_detect_old_command_line_syntax(int argc, char** argv, int* count) ZeroMemory(settings, sizeof(rdpSettings)); CommandLineClearArgumentsA(old_args); + status = CommandLineParseArgumentsA(argc, (const char**) argv, old_args, flags, settings, freerdp_client_old_command_line_pre_filter, NULL); + if (status < 0) + { + free(settings); return status; + } arg = old_args; diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index c416c51b9..db8f4450c 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -428,6 +428,9 @@ int freerdp_context_new(freerdp* instance) */ void freerdp_context_free(freerdp* instance) { + if (!instance) + return; + if (!instance->context) return; diff --git a/libfreerdp/core/gateway/tsg.c b/libfreerdp/core/gateway/tsg.c index e10e164c8..896c6ce29 100644 --- a/libfreerdp/core/gateway/tsg.c +++ b/libfreerdp/core/gateway/tsg.c @@ -350,23 +350,29 @@ BOOL TsProxyCreateTunnelReadResponse(rdpTsg* tsg, RPC_PDU* pdu) offset += 4; Pointer = *((UINT32*) &buffer[offset]); offset += 4; - if(Pointer) { + + if (Pointer) + { offset += 4; // MaxCount offset += 8; // UnicodeString Offset, Length } - if(MsgBytes > TSG_MESSAGING_MAX_MESSAGE_LENGTH) { - fprintf(stderr, "Out of Spec Message Length %d"); + + if (MsgBytes > TSG_MESSAGING_MAX_MESSAGE_LENGTH) + { + fprintf(stderr, "Out of Spec Message Length %d", MsgBytes); return FALSE; } offset += MsgBytes; break; + case TSG_ASYNC_MESSAGE_REAUTH: rpc_offset_align(&offset, 8); offset += 8; // UINT64 TunnelContext, not to be confused with // the ContextHandle TunnelContext below. break; + default: - fprintf(stderr, "Unexpected Message Type: 0x%X\n", MessageSwitchValue); + fprintf(stderr, "Unexpected Message Type: 0x%X\n", (int) MessageSwitchValue); return FALSE; } From 1fc2d780f7d5e167edab49c47ebb1082501038bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 31 Oct 2013 23:35:24 -0400 Subject: [PATCH 26/40] libfreerdp-core: fix memory leaks reported by valgrind --- client/X11/xf_client.c | 22 +++++++++++++++++++--- client/X11/xf_event.c | 4 +++- client/X11/xf_keyboard.c | 5 +++++ client/X11/xf_monitor.c | 10 ++++++++-- include/freerdp/crypto/tls.h | 1 - libfreerdp/core/connection.c | 27 +++++++++++++++++---------- libfreerdp/core/info.c | 14 +++++++++++++- libfreerdp/core/orders.c | 4 ++++ libfreerdp/core/redirection.c | 1 + libfreerdp/core/tcp.c | 7 +++++++ libfreerdp/core/transport.c | 23 ++++++++++++++++++++--- libfreerdp/crypto/tls.c | 35 ++++++++++++++++------------------- 12 files changed, 113 insertions(+), 40 deletions(-) diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index c586dbb58..a29499339 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -728,8 +728,12 @@ static void xf_post_disconnect(freerdp *instance) assert(NULL != xfc); assert(NULL != instance->settings); - WaitForSingleObject(xfc->mutex, INFINITE); - CloseHandle(xfc->mutex); + if (xfc->mutex) + { + WaitForSingleObject(xfc->mutex, INFINITE); + CloseHandle(xfc->mutex); + xfc->mutex = NULL; + } xf_monitors_free(xfc, instance->settings); } @@ -938,6 +942,10 @@ BOOL xf_post_connect(freerdp* instance) xf_create_window(xfc); ZeroMemory(&gcv, sizeof(gcv)); + + if (xfc->modifier_map) + XFreeModifiermap(xfc->modifier_map); + xfc->modifier_map = XGetModifierMapping(xfc->display); xfc->gc = XCreateGC(xfc->display, xfc->drawable, GCGraphicsExposures, &gcv); @@ -1389,6 +1397,15 @@ void* xf_thread(void* param) if (!status) { + if (xfc->mutex) + { + WaitForSingleObject(xfc->mutex, INFINITE); + CloseHandle(xfc->mutex); + xfc->mutex = NULL; + } + + xf_monitors_free(xfc, instance->settings); + exit_code = XF_EXIT_CONN_FAILED; ExitThread(exit_code); } @@ -1830,7 +1847,6 @@ static int xfreerdp_client_new(freerdp* instance, rdpContext* context) PubSub_SubscribeParamChange(context->pubSub, (pParamChangeEventHandler) xf_ParamChangeEventHandler); PubSub_SubscribeScalingFactorChange(context->pubSub, (pScalingFactorChangeEventHandler) xf_ScalingFactorChangeEventHandler); - return 0; } diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index 7205a7b67..74947fb98 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -475,7 +475,9 @@ static BOOL xf_event_MappingNotify(xfContext* xfc, XEvent* event, BOOL app) { if (event->xmapping.request == MappingModifier) { - XFreeModifiermap(xfc->modifier_map); + if (xfc->modifier_map) + XFreeModifiermap(xfc->modifier_map); + xfc->modifier_map = XGetModifierMapping(xfc->display); } diff --git a/client/X11/xf_keyboard.c b/client/X11/xf_keyboard.c index 8b5cf0b33..e6427e190 100644 --- a/client/X11/xf_keyboard.c +++ b/client/X11/xf_keyboard.c @@ -38,9 +38,14 @@ void xf_kbd_init(xfContext* xfc) { xf_kbd_clear(xfc); + xfc->keyboard_layout_id = xfc->instance->settings->KeyboardLayout; xfc->keyboard_layout_id = freerdp_keyboard_init(xfc->keyboard_layout_id); xfc->instance->settings->KeyboardLayout = xfc->keyboard_layout_id; + + if (xfc->modifier_map) + XFreeModifiermap(xfc->modifier_map); + xfc->modifier_map = XGetModifierMapping(xfc->display); } diff --git a/client/X11/xf_monitor.c b/client/X11/xf_monitor.c index fc4d23bf2..e38918846 100644 --- a/client/X11/xf_monitor.c +++ b/client/X11/xf_monitor.c @@ -261,10 +261,16 @@ BOOL xf_detect_monitors(xfContext* xfc, rdpSettings* settings) void xf_monitors_free(xfContext *xfc, rdpSettings *settings) { #ifdef WITH_XINERAMA - if(xfc->vscreen.monitors) + if (xfc->vscreen.monitors) + { free(xfc->vscreen.monitors); + xfc->vscreen.monitors = NULL; + } #endif - if(settings->MonitorIds) + if (settings->MonitorIds) + { free(settings->MonitorIds); + settings->MonitorIds = NULL; + } } diff --git a/include/freerdp/crypto/tls.h b/include/freerdp/crypto/tls.h index a18597308..09ff7a3a0 100644 --- a/include/freerdp/crypto/tls.h +++ b/include/freerdp/crypto/tls.h @@ -58,7 +58,6 @@ FREERDP_API BOOL tls_disconnect(rdpTls* tls); FREERDP_API int tls_read(rdpTls* tls, BYTE* data, int length); FREERDP_API int tls_write(rdpTls* tls, BYTE* data, int length); -FREERDP_API int tls_read_all(rdpTls* tls, BYTE* data, int length); FREERDP_API int tls_write_all(rdpTls* tls, BYTE* data, int length); FREERDP_API int tls_wait_read(rdpTls* tls); diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 97030a760..93b3f2a9d 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -286,22 +286,22 @@ BOOL rdp_client_redirect(rdpRdp* rdp) /* FIXME: this is a subset of rdp_free */ /* --> this should really go into rdp.c */ crypto_rc4_free(rdp->rc4_decrypt_key); - rdp->rc4_decrypt_key = NULL ; + rdp->rc4_decrypt_key = NULL; crypto_rc4_free(rdp->rc4_encrypt_key); rdp->rc4_encrypt_key = NULL; crypto_des3_free(rdp->fips_encrypt); - rdp->fips_encrypt = NULL ; + rdp->fips_encrypt = NULL; crypto_des3_free(rdp->fips_decrypt); - rdp->fips_decrypt = NULL ; + rdp->fips_decrypt = NULL; crypto_hmac_free(rdp->fips_hmac); - rdp->fips_hmac = NULL ; + rdp->fips_hmac = NULL; free(settings->ServerRandom); settings->ServerRandom = NULL ; free(settings->ServerCertificate); - settings->ServerCertificate = NULL ; + settings->ServerCertificate = NULL; free(settings->ClientAddress); - settings->ClientAddress = NULL ; + settings->ClientAddress = NULL; mppc_enc_free(rdp->mppc_enc); mppc_dec_free(rdp->mppc_dec); @@ -364,6 +364,8 @@ BOOL rdp_client_redirect(rdpRdp* rdp) return rdp_client_connect(rdp); } +static BYTE fips_ivec[8] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; + static BOOL rdp_client_establish_keys(rdpRdp* rdp) { BYTE* mod; @@ -380,10 +382,17 @@ static BOOL rdp_client_establish_keys(rdpRdp* rdp) } /* encrypt client random */ - if (rdp->settings->ClientRandom) free(rdp->settings->ClientRandom); + + if (rdp->settings->ClientRandom) + free(rdp->settings->ClientRandom); + rdp->settings->ClientRandom = malloc(CLIENT_RANDOM_LENGTH); - if (rdp->settings->ClientRandom == NULL) return FALSE; + + if (!rdp->settings->ClientRandom) + return FALSE; + ZeroMemory(crypt_client_random, sizeof(crypt_client_random)); + crypto_nonce(rdp->settings->ClientRandom, CLIENT_RANDOM_LENGTH); key_len = rdp->settings->RdpServerCertificate->cert_info.ModulusLength; mod = rdp->settings->RdpServerCertificate->cert_info.Modulus; @@ -422,7 +431,6 @@ static BOOL rdp_client_establish_keys(rdpRdp* rdp) if (rdp->settings->EncryptionMethods == ENCRYPTION_METHOD_FIPS) { - BYTE fips_ivec[8] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; rdp->fips_encrypt = crypto_des3_encrypt_init(rdp->fips_encrypt_key, fips_ivec); rdp->fips_decrypt = crypto_des3_decrypt_init(rdp->fips_decrypt_key, fips_ivec); @@ -503,7 +511,6 @@ BOOL rdp_server_establish_keys(rdpRdp* rdp, wStream* s) if (rdp->settings->EncryptionMethods == ENCRYPTION_METHOD_FIPS) { - BYTE fips_ivec[8] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; rdp->fips_encrypt = crypto_des3_encrypt_init(rdp->fips_encrypt_key, fips_ivec); rdp->fips_decrypt = crypto_des3_decrypt_init(rdp->fips_decrypt_key, fips_ivec); diff --git a/libfreerdp/core/info.c b/libfreerdp/core/info.c index 3b88012fe..671840152 100644 --- a/libfreerdp/core/info.c +++ b/libfreerdp/core/info.c @@ -139,18 +139,28 @@ BOOL rdp_read_extended_info_packet(wStream* s, rdpSettings* settings) if (Stream_GetRemainingLength(s) < cbClientAddress) return FALSE; + if (settings->ClientAddress) + { + free(settings->ClientAddress); + settings->ClientAddress = NULL; + } + ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Pointer(s), cbClientAddress / 2, &settings->ClientAddress, 0, NULL, NULL); Stream_Seek(s, cbClientAddress); if (Stream_GetRemainingLength(s) < 2) return FALSE; + Stream_Read_UINT16(s, cbClientDir); /* cbClientDir */ if (Stream_GetRemainingLength(s) < cbClientDir) return FALSE; if (settings->ClientDir) + { free(settings->ClientDir); + settings->ClientDir = NULL; + } ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Pointer(s), cbClientDir / 2, &settings->ClientDir, 0, NULL, NULL); Stream_Seek(s, cbClientDir); @@ -238,10 +248,12 @@ void rdp_write_extended_info_packet(wStream* s, rdpSettings* settings) clientCookie->logonId = serverCookie->logonId; hmac = crypto_hmac_new(); + crypto_hmac_md5_init(hmac, serverCookie->arcRandomBits, 16); + if (settings->SelectedProtocol == PROTOCOL_RDP) { - crypto_hmac_update(hmac, (BYTE *) (settings->ClientRandom), 32); + crypto_hmac_update(hmac, (BYTE*) (settings->ClientRandom), 32); } else { diff --git a/libfreerdp/core/orders.c b/libfreerdp/core/orders.c index 12475aa8a..6fb547d9d 100644 --- a/libfreerdp/core/orders.c +++ b/libfreerdp/core/orders.c @@ -1669,7 +1669,11 @@ BOOL update_read_fast_glyph_order(wStream* s, ORDER_INFO* orderInfo, FAST_GLYPH_ return FALSE; if (glyph->aj) + { free(glyph->aj); + glyph->aj = NULL; + } + glyph->aj = (BYTE*) malloc(glyph->cb); Stream_Read(s, glyph->aj, glyph->cb); } diff --git a/libfreerdp/core/redirection.c b/libfreerdp/core/redirection.c index 433731df4..4db501033 100644 --- a/libfreerdp/core/redirection.c +++ b/libfreerdp/core/redirection.c @@ -96,6 +96,7 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) if (Stream_GetRemainingLength(s) < 12) return FALSE; + Stream_Read_UINT16(s, flags); /* flags (2 bytes) */ Stream_Read_UINT16(s, length); /* length (2 bytes) */ Stream_Read_UINT32(s, redirection->sessionID); /* sessionID (4 bytes) */ diff --git a/libfreerdp/core/tcp.c b/libfreerdp/core/tcp.c index 904865563..4b57a3354 100644 --- a/libfreerdp/core/tcp.c +++ b/libfreerdp/core/tcp.c @@ -79,6 +79,13 @@ void tcp_get_ip_address(rdpTcp * tcp) tcp->ip_address[sizeof(tcp->ip_address) - 1] = 0; tcp->settings->IPv6Enabled = 0; + + if (tcp->settings->ClientAddress) + { + free(tcp->settings->ClientAddress); + tcp->settings->ClientAddress = NULL; + } + tcp->settings->ClientAddress = _strdup(tcp->ip_address); } diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 3cd138273..d082844c2 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -218,7 +218,6 @@ BOOL transport_connect_tls(rdpTransport* transport) connectErrorCode = TLSCONNECTERROR; tls_free(transport->TsgTls); - transport->TsgTls = NULL; return FALSE; @@ -537,6 +536,12 @@ int transport_read(rdpTransport* transport, wStream* s) pduLength = 0; transport_status = 0; + if (!transport) + return -1; + + if (!s) + return -1; + /* first check if we have header */ streamPosition = Stream_GetPosition(s); @@ -790,6 +795,9 @@ int transport_check_fds(rdpTransport** ptransport) wStream* received; rdpTransport* transport = *ptransport; + if (!transport) + return -1; + #ifdef _WIN32 WSAResetEvent(transport->TcpIn->wsa_event); #endif @@ -881,10 +889,11 @@ int transport_check_fds(rdpTransport** ptransport) recv_status = transport->ReceiveCallback(transport, received, transport->ReceiveExtra); if (transport == *ptransport) + { /* transport might now have been freed by rdp_client_redirect and a new rdp->transport created */ /* so only release if still valid */ Stream_Release(received); - + } if (recv_status < 0) status = -1; @@ -1029,12 +1038,20 @@ void transport_free(rdpTransport* transport) if (transport->TlsOut != transport->TlsIn) tls_free(transport->TlsOut); - tcp_free(transport->TcpIn); + transport->TlsIn = NULL; + transport->TlsOut = NULL; + + if (transport->TcpIn) + tcp_free(transport->TcpIn); if (transport->TcpOut != transport->TcpIn) tcp_free(transport->TcpOut); + transport->TcpIn = NULL; + transport->TcpOut = NULL; + tsg_free(transport->tsg); + transport->tsg = NULL; CloseHandle(transport->ReadMutex); CloseHandle(transport->WriteMutex); diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index 324e00acf..1b5c92ab8 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -371,9 +371,15 @@ int tls_read(rdpTls* tls, BYTE* data, int length) int error; int status; - status = tls ? SSL_read(tls->ssl, data, length) : -1; + if (!tls) + return -1; - if (tls && status <= 0) + if (!tls->ssl) + return -1; + + status = SSL_read(tls->ssl, data, length); + + if (status <= 0) { error = SSL_get_error(tls->ssl, status); @@ -412,26 +418,17 @@ int tls_read(rdpTls* tls, BYTE* data, int length) return status; } -int tls_read_all(rdpTls* tls, BYTE* data, int length) -{ - int status; - - do - { - status = tls_read(tls, data, length); - if (status == 0) - tls_wait_read(tls); - } - while (status == 0); - - return status; -} - int tls_write(rdpTls* tls, BYTE* data, int length) { int error; int status; + if (!tls) + return -1; + + if (!tls->ssl) + return -1; + status = SSL_write(tls->ssl, data, length); if (status <= 0) @@ -777,7 +774,7 @@ rdpTls* tls_new(rdpSettings* settings) tls = (rdpTls*) malloc(sizeof(rdpTls)); - if (tls != NULL) + if (tls) { ZeroMemory(tls, sizeof(rdpTls)); @@ -793,7 +790,7 @@ rdpTls* tls_new(rdpSettings* settings) void tls_free(rdpTls* tls) { - if (tls != NULL) + if (tls) { if (tls->ssl) { From 3cdc490bf4bdf275a65933a908984d1660941340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 1 Nov 2013 10:01:16 -0400 Subject: [PATCH 27/40] libfreerdp-cache: refactor glyph cache and add logging --- include/freerdp/cache/glyph.h | 2 + libfreerdp/cache/glyph.c | 267 +++++++++++++++++++--------------- libfreerdp/core/connection.c | 10 +- libfreerdp/gdi/gdi.c | 2 +- 4 files changed, 155 insertions(+), 126 deletions(-) diff --git a/include/freerdp/cache/glyph.h b/include/freerdp/cache/glyph.h index 35f702598..c46102803 100644 --- a/include/freerdp/cache/glyph.h +++ b/include/freerdp/cache/glyph.h @@ -24,6 +24,7 @@ #include #include +#include #include typedef struct _GLYPH_CACHE GLYPH_CACHE; @@ -56,6 +57,7 @@ struct rdp_glyph_cache FRAGMENT_CACHE fragCache; GLYPH_CACHE glyphCache[10]; + wLog* log; rdpContext* context; rdpSettings* settings; }; diff --git a/libfreerdp/cache/glyph.c b/libfreerdp/cache/glyph.c index 799b73dc7..ac4303228 100644 --- a/libfreerdp/cache/glyph.c +++ b/libfreerdp/cache/glyph.c @@ -170,22 +170,22 @@ void update_process_glyph_fragments(rdpContext* context, BYTE* data, UINT32 leng Glyph_EndDraw(context, bkX, bkY, bkWidth, bkHeight, bgcolor, fgcolor); } -void update_gdi_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyph_index) +void update_gdi_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyphIndex) { rdpGlyphCache* glyph_cache; glyph_cache = context->cache->glyph; - update_process_glyph_fragments(context, glyph_index->data, glyph_index->cbData, - glyph_index->cacheId, glyph_index->ulCharInc, glyph_index->flAccel, - glyph_index->backColor, glyph_index->foreColor, glyph_index->x, glyph_index->y, - glyph_index->bkLeft, glyph_index->bkTop, - glyph_index->bkRight - glyph_index->bkLeft, glyph_index->bkBottom - glyph_index->bkTop, - glyph_index->opLeft, glyph_index->opTop, - glyph_index->opRight - glyph_index->opLeft, glyph_index->opBottom - glyph_index->opTop); + update_process_glyph_fragments(context, glyphIndex->data, glyphIndex->cbData, + glyphIndex->cacheId, glyphIndex->ulCharInc, glyphIndex->flAccel, + glyphIndex->backColor, glyphIndex->foreColor, glyphIndex->x, glyphIndex->y, + glyphIndex->bkLeft, glyphIndex->bkTop, + glyphIndex->bkRight - glyphIndex->bkLeft, glyphIndex->bkBottom - glyphIndex->bkTop, + glyphIndex->opLeft, glyphIndex->opTop, + glyphIndex->opRight - glyphIndex->opLeft, glyphIndex->opBottom - glyphIndex->opTop); } -void update_gdi_fast_index(rdpContext* context, FAST_INDEX_ORDER* fast_index) +void update_gdi_fast_index(rdpContext* context, FAST_INDEX_ORDER* fastIndex) { INT32 x, y; INT32 opLeft, opTop; @@ -194,131 +194,131 @@ void update_gdi_fast_index(rdpContext* context, FAST_INDEX_ORDER* fast_index) glyph_cache = context->cache->glyph; - opLeft = fast_index->opLeft; - opTop = fast_index->opTop; - opRight = fast_index->opRight; - opBottom = fast_index->opBottom; - x = fast_index->x; - y = fast_index->y; + opLeft = fastIndex->opLeft; + opTop = fastIndex->opTop; + opRight = fastIndex->opRight; + opBottom = fastIndex->opBottom; + x = fastIndex->x; + y = fastIndex->y; if (opBottom == -32768) { BYTE flags = (BYTE) (opTop & 0x0F); if (flags & 0x01) - opBottom = fast_index->bkBottom; + opBottom = fastIndex->bkBottom; if (flags & 0x02) - opRight = fast_index->bkRight; + opRight = fastIndex->bkRight; if (flags & 0x04) - opTop = fast_index->bkTop; + opTop = fastIndex->bkTop; if (flags & 0x08) - opLeft = fast_index->bkLeft; + opLeft = fastIndex->bkLeft; } if (opLeft == 0) - opLeft = fast_index->bkLeft; + opLeft = fastIndex->bkLeft; if (opRight == 0) - opRight = fast_index->bkRight; + opRight = fastIndex->bkRight; if (x == -32768) - x = fast_index->bkLeft; + x = fastIndex->bkLeft; if (y == -32768) - y = fast_index->bkTop; + y = fastIndex->bkTop; - update_process_glyph_fragments(context, fast_index->data, fast_index->cbData, - fast_index->cacheId, fast_index->ulCharInc, fast_index->flAccel, - fast_index->backColor, fast_index->foreColor, x, y, - fast_index->bkLeft, fast_index->bkTop, - fast_index->bkRight - fast_index->bkLeft, fast_index->bkBottom - fast_index->bkTop, + update_process_glyph_fragments(context, fastIndex->data, fastIndex->cbData, + fastIndex->cacheId, fastIndex->ulCharInc, fastIndex->flAccel, + fastIndex->backColor, fastIndex->foreColor, x, y, + fastIndex->bkLeft, fastIndex->bkTop, + fastIndex->bkRight - fastIndex->bkLeft, fastIndex->bkBottom - fastIndex->bkTop, opLeft, opTop, opRight - opLeft, opBottom - opTop); } -void update_gdi_fast_glyph(rdpContext* context, FAST_GLYPH_ORDER* fast_glyph) +void update_gdi_fast_glyph(rdpContext* context, FAST_GLYPH_ORDER* fastGlyph) { INT32 x, y; rdpGlyph* glyph; BYTE text_data[2]; INT32 opLeft, opTop; INT32 opRight, opBottom; - GLYPH_DATA_V2* glyph_data; + GLYPH_DATA_V2* glyphData; rdpCache* cache = context->cache; - opLeft = fast_glyph->opLeft; - opTop = fast_glyph->opTop; - opRight = fast_glyph->opRight; - opBottom = fast_glyph->opBottom; - x = fast_glyph->x; - y = fast_glyph->y; + opLeft = fastGlyph->opLeft; + opTop = fastGlyph->opTop; + opRight = fastGlyph->opRight; + opBottom = fastGlyph->opBottom; + x = fastGlyph->x; + y = fastGlyph->y; if (opBottom == -32768) { BYTE flags = (BYTE) (opTop & 0x0F); if (flags & 0x01) - opBottom = fast_glyph->bkBottom; + opBottom = fastGlyph->bkBottom; if (flags & 0x02) - opRight = fast_glyph->bkRight; + opRight = fastGlyph->bkRight; if (flags & 0x04) - opTop = fast_glyph->bkTop; + opTop = fastGlyph->bkTop; if (flags & 0x08) - opLeft = fast_glyph->bkLeft; + opLeft = fastGlyph->bkLeft; } if (opLeft == 0) - opLeft = fast_glyph->bkLeft; + opLeft = fastGlyph->bkLeft; if (opRight == 0) - opRight = fast_glyph->bkRight; + opRight = fastGlyph->bkRight; if (x == -32768) - x = fast_glyph->bkLeft; + x = fastGlyph->bkLeft; if (y == -32768) - y = fast_glyph->bkTop; + y = fastGlyph->bkTop; - if (fast_glyph->cbData > 1 && NULL != fast_glyph->glyphData.aj) + if ((fastGlyph->cbData > 1) && (fastGlyph->glyphData.aj)) { /* got option font that needs to go into cache */ - glyph_data = &fast_glyph->glyphData; + glyphData = &fastGlyph->glyphData; glyph = Glyph_Alloc(context); - glyph->x = glyph_data->x; - glyph->y = glyph_data->y; - glyph->cx = glyph_data->cx; - glyph->cy = glyph_data->cy; - glyph->cb = glyph_data->cb; - glyph->aj = malloc(glyph_data->cb); - CopyMemory(glyph->aj, glyph_data->aj, glyph->cb); + glyph->x = glyphData->x; + glyph->y = glyphData->y; + glyph->cx = glyphData->cx; + glyph->cy = glyphData->cy; + glyph->cb = glyphData->cb; + glyph->aj = malloc(glyphData->cb); + CopyMemory(glyph->aj, glyphData->aj, glyph->cb); Glyph_New(context, glyph); - glyph_cache_put(cache->glyph, fast_glyph->cacheId, fast_glyph->data[0], glyph); + glyph_cache_put(cache->glyph, fastGlyph->cacheId, fastGlyph->data[0], glyph); } - text_data[0] = fast_glyph->data[0]; + text_data[0] = fastGlyph->data[0]; text_data[1] = 0; update_process_glyph_fragments(context, text_data, 1, - fast_glyph->cacheId, fast_glyph->ulCharInc, fast_glyph->flAccel, - fast_glyph->backColor, fast_glyph->foreColor, x, y, - fast_glyph->bkLeft, fast_glyph->bkTop, - fast_glyph->bkRight - fast_glyph->bkLeft, fast_glyph->bkBottom - fast_glyph->bkTop, + fastGlyph->cacheId, fastGlyph->ulCharInc, fastGlyph->flAccel, + fastGlyph->backColor, fastGlyph->foreColor, x, y, + fastGlyph->bkLeft, fastGlyph->bkTop, + fastGlyph->bkRight - fastGlyph->bkLeft, fastGlyph->bkBottom - fastGlyph->bkTop, opLeft, opTop, opRight - opLeft, opBottom - opTop); } -void update_gdi_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cache_glyph) +void update_gdi_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cacheGlyph) { int i; rdpGlyph* glyph; GLYPH_DATA* glyph_data; rdpCache* cache = context->cache; - for (i = 0; i < (int) cache_glyph->cGlyphs; i++) + for (i = 0; i < (int) cacheGlyph->cGlyphs; i++) { - glyph_data = &cache_glyph->glyphData[i]; + glyph_data = &cacheGlyph->glyphData[i]; glyph = Glyph_Alloc(context); @@ -330,60 +330,62 @@ void update_gdi_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cache_glyph) glyph->aj = glyph_data->aj; Glyph_New(context, glyph); - glyph_cache_put(cache->glyph, cache_glyph->cacheId, glyph_data->cacheIndex, glyph); + glyph_cache_put(cache->glyph, cacheGlyph->cacheId, glyph_data->cacheIndex, glyph); } } -void update_gdi_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cache_glyph_v2) +void update_gdi_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cacheGlyphV2) { int i; rdpGlyph* glyph; - GLYPH_DATA_V2* glyph_data; + GLYPH_DATA_V2* glyphData; rdpCache* cache = context->cache; - for (i = 0; i < (int) cache_glyph_v2->cGlyphs; i++) + for (i = 0; i < (int) cacheGlyphV2->cGlyphs; i++) { - glyph_data = &cache_glyph_v2->glyphData[i]; + glyphData = &cacheGlyphV2->glyphData[i]; glyph = Glyph_Alloc(context); - glyph->x = glyph_data->x; - glyph->y = glyph_data->y; - glyph->cx = glyph_data->cx; - glyph->cy = glyph_data->cy; - glyph->cb = glyph_data->cb; - glyph->aj = glyph_data->aj; + glyph->x = glyphData->x; + glyph->y = glyphData->y; + glyph->cx = glyphData->cx; + glyph->cy = glyphData->cy; + glyph->cb = glyphData->cb; + glyph->aj = glyphData->aj; Glyph_New(context, glyph); - glyph_cache_put(cache->glyph, cache_glyph_v2->cacheId, glyph_data->cacheIndex, glyph); + glyph_cache_put(cache->glyph, cacheGlyphV2->cacheId, glyphData->cacheIndex, glyph); } } -rdpGlyph* glyph_cache_get(rdpGlyphCache* glyph_cache, UINT32 id, UINT32 index) +rdpGlyph* glyph_cache_get(rdpGlyphCache* glyphCache, UINT32 id, UINT32 index) { rdpGlyph* glyph; + WLog_Print(glyphCache->log, WLOG_DEBUG, "GlyphCacheGet: id: %d index: %d", id, index); + if (id > 9) { fprintf(stderr, "invalid glyph cache id: %d\n", id); return NULL; } - if (index > glyph_cache->glyphCache[id].number) + if (index > glyphCache->glyphCache[id].number) { fprintf(stderr, "index %d out of range for cache id: %d\n", index, id); return NULL; } - glyph = glyph_cache->glyphCache[id].entries[index]; + glyph = glyphCache->glyphCache[id].entries[index]; - if (glyph == NULL) + if (!glyph) fprintf(stderr, "no glyph found at cache index: %d in cache id: %d\n", index, id); return glyph; } -void glyph_cache_put(rdpGlyphCache* glyph_cache, UINT32 id, UINT32 index, rdpGlyph* glyph) +void glyph_cache_put(rdpGlyphCache* glyphCache, UINT32 id, UINT32 index, rdpGlyph* glyph) { rdpGlyph* prevGlyph; @@ -393,48 +395,67 @@ void glyph_cache_put(rdpGlyphCache* glyph_cache, UINT32 id, UINT32 index, rdpGly return; } - if (index > glyph_cache->glyphCache[id].number) + if (index > glyphCache->glyphCache[id].number) { fprintf(stderr, "invalid glyph cache index: %d in cache id: %d\n", index, id); return; } - prevGlyph = glyph_cache->glyphCache[id].entries[index]; + WLog_Print(glyphCache->log, WLOG_DEBUG, "GlyphCachePut: id: %d index: %d", id, index); - if (prevGlyph != NULL) + prevGlyph = glyphCache->glyphCache[id].entries[index]; + + if (prevGlyph) { - Glyph_Free(glyph_cache->context, prevGlyph); - if (NULL != prevGlyph->aj) + Glyph_Free(glyphCache->context, prevGlyph); + + if (prevGlyph->aj) free(prevGlyph->aj); free(prevGlyph); } - glyph_cache->glyphCache[id].entries[index] = glyph; + glyphCache->glyphCache[id].entries[index] = glyph; } -void* glyph_cache_fragment_get(rdpGlyphCache* glyph_cache, UINT32 index, UINT32* size) +void* glyph_cache_fragment_get(rdpGlyphCache* glyphCache, UINT32 index, UINT32* size) { void* fragment; - fragment = glyph_cache->fragCache.entries[index].fragment; - *size = (BYTE) glyph_cache->fragCache.entries[index].size; + if (index > 255) + { + fprintf(stderr, "invalid glyph cache fragment index: %d\n", index); + return NULL; + } - if (fragment == NULL) + fragment = glyphCache->fragCache.entries[index].fragment; + *size = (BYTE) glyphCache->fragCache.entries[index].size; + + WLog_Print(glyphCache->log, WLOG_DEBUG, "GlyphCacheFragmentGet: index: %d size: %d", index, *size); + + if (!fragment) fprintf(stderr, "invalid glyph fragment at index:%d\n", index); return fragment; } -void glyph_cache_fragment_put(rdpGlyphCache* glyph_cache, UINT32 index, UINT32 size, void* fragment) +void glyph_cache_fragment_put(rdpGlyphCache* glyphCache, UINT32 index, UINT32 size, void* fragment) { void* prevFragment; - prevFragment = glyph_cache->fragCache.entries[index].fragment; + if (index > 255) + { + fprintf(stderr, "invalid glyph cache fragment index: %d\n", index); + return; + } - glyph_cache->fragCache.entries[index].fragment = fragment; - glyph_cache->fragCache.entries[index].size = size; + WLog_Print(glyphCache->log, WLOG_DEBUG, "GlyphCacheFragmentPut: index: %d size: %d", index, size); - if (prevFragment != NULL) + prevFragment = glyphCache->fragCache.entries[index].fragment; + + glyphCache->fragCache.entries[index].fragment = fragment; + glyphCache->fragCache.entries[index].size = size; + + if (!prevFragment) free(prevFragment); } @@ -449,36 +470,40 @@ void glyph_cache_register_callbacks(rdpUpdate* update) rdpGlyphCache* glyph_cache_new(rdpSettings* settings) { - rdpGlyphCache* glyph; + rdpGlyphCache* glyphCache; - glyph = (rdpGlyphCache*) malloc(sizeof(rdpGlyphCache)); - ZeroMemory(glyph, sizeof(rdpGlyphCache)); + glyphCache = (rdpGlyphCache*) malloc(sizeof(rdpGlyphCache)); - if (glyph != NULL) + if (glyphCache) { int i; - glyph->settings = settings; - glyph->context = ((freerdp*) settings->instance)->update->context; + ZeroMemory(glyphCache, sizeof(rdpGlyphCache)); + + WLog_Init(); + glyphCache->log = WLog_Get("com.freerdp.cache.glyph"); + + glyphCache->settings = settings; + glyphCache->context = ((freerdp*) settings->instance)->update->context; for (i = 0; i < 10; i++) { - glyph->glyphCache[i].number = settings->GlyphCache[i].cacheEntries; - glyph->glyphCache[i].maxCellSize = settings->GlyphCache[i].cacheMaximumCellSize; - glyph->glyphCache[i].entries = (rdpGlyph**) malloc(sizeof(rdpGlyph*) * glyph->glyphCache[i].number); - ZeroMemory(glyph->glyphCache[i].entries, sizeof(rdpGlyph*) * glyph->glyphCache[i].number); + glyphCache->glyphCache[i].number = settings->GlyphCache[i].cacheEntries; + glyphCache->glyphCache[i].maxCellSize = settings->GlyphCache[i].cacheMaximumCellSize; + glyphCache->glyphCache[i].entries = (rdpGlyph**) malloc(sizeof(rdpGlyph*) * glyphCache->glyphCache[i].number); + ZeroMemory(glyphCache->glyphCache[i].entries, sizeof(rdpGlyph*) * glyphCache->glyphCache[i].number); } - glyph->fragCache.entries = malloc(sizeof(FRAGMENT_CACHE_ENTRY) * 256); - ZeroMemory(glyph->fragCache.entries, sizeof(FRAGMENT_CACHE_ENTRY) * 256); + glyphCache->fragCache.entries = malloc(sizeof(FRAGMENT_CACHE_ENTRY) * 256); + ZeroMemory(glyphCache->fragCache.entries, sizeof(FRAGMENT_CACHE_ENTRY) * 256); } - return glyph; + return glyphCache; } -void glyph_cache_free(rdpGlyphCache* glyph_cache) +void glyph_cache_free(rdpGlyphCache* glyphCache) { - if (glyph_cache != NULL) + if (glyphCache) { int i; void* fragment; @@ -487,33 +512,35 @@ void glyph_cache_free(rdpGlyphCache* glyph_cache) { int j; - for (j = 0; j < (int) glyph_cache->glyphCache[i].number; j++) + for (j = 0; j < (int) glyphCache->glyphCache[i].number; j++) { rdpGlyph* glyph; - glyph = glyph_cache->glyphCache[i].entries[j]; + glyph = glyphCache->glyphCache[i].entries[j]; - if (glyph != NULL) + if (glyph) { - Glyph_Free(glyph_cache->context, glyph); + Glyph_Free(glyphCache->context, glyph); + if (glyph->aj) free(glyph->aj); free(glyph); - glyph_cache->glyphCache[i].entries[j] = NULL; + + glyphCache->glyphCache[i].entries[j] = NULL; } } - free(glyph_cache->glyphCache[i].entries); - glyph_cache->glyphCache[i].entries = NULL; + free(glyphCache->glyphCache[i].entries); + glyphCache->glyphCache[i].entries = NULL; } for (i = 0; i < 255; i++) { - fragment = glyph_cache->fragCache.entries[i].fragment; + fragment = glyphCache->fragCache.entries[i].fragment; free(fragment); - glyph_cache->fragCache.entries[i].fragment = NULL; + glyphCache->fragCache.entries[i].fragment = NULL; } - free(glyph_cache->fragCache.entries); - free(glyph_cache); + free(glyphCache->fragCache.entries); + free(glyphCache); } } diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 93b3f2a9d..dff3e3952 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -175,12 +175,12 @@ BOOL rdp_client_connect(rdpRdp* rdp) if (settings->GatewayEnabled) { - char* user; - char* domain; - char* cookie; + char* user = NULL; + char* domain = NULL; + char* cookie = NULL; int user_length = 0; - int domain_length; - int cookie_length; + int domain_length = 0; + int cookie_length = 0; if (settings->Username) { diff --git a/libfreerdp/gdi/gdi.c b/libfreerdp/gdi/gdi.c index f72f6b2e0..baa503edb 100644 --- a/libfreerdp/gdi/gdi.c +++ b/libfreerdp/gdi/gdi.c @@ -1036,7 +1036,7 @@ int gdi_init(freerdp* instance, UINT32 flags, BYTE* buffer) gdi->tile = gdi_bitmap_new_ex(gdi, 64, 64, 32, NULL); gdi->image = gdi_bitmap_new_ex(gdi, 64, 64, 32, NULL); - if (cache == NULL) + if (!cache) { cache = cache_new(instance->settings); instance->context->cache = cache; From 9829504fc13685e19a37092c739029586d86e8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 1 Nov 2013 10:24:19 -0400 Subject: [PATCH 28/40] libfreerdp-core: start async transport thread after successful transport-level connection --- libfreerdp/core/gateway/tsg.c | 4 ++-- libfreerdp/core/transport.c | 21 ++++++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/libfreerdp/core/gateway/tsg.c b/libfreerdp/core/gateway/tsg.c index 896c6ce29..53595cd03 100644 --- a/libfreerdp/core/gateway/tsg.c +++ b/libfreerdp/core/gateway/tsg.c @@ -210,7 +210,7 @@ BOOL TsProxyCreateTunnelReadResponse(rdpTsg* tsg, RPC_PDU* pdu) UINT32 Pointer; PTSG_PACKET packet; UINT32 SwitchValue; - UINT32 MessageSwitchValue; + UINT32 MessageSwitchValue = 0; UINT32 IsMessagePresent; UINT32 MsgBytes; rdpRpc* rpc = tsg->rpc; @@ -340,7 +340,7 @@ BOOL TsProxyCreateTunnelReadResponse(rdpTsg* tsg, RPC_PDU* pdu) tsgCaps->tsgPacket.tsgCapNap.capabilities = *((UINT32*) &buffer[offset]); /* Capabilities */ offset += 4; - switch(MessageSwitchValue) + switch (MessageSwitchValue) { case TSG_ASYNC_MESSAGE_CONSENT_MESSAGE: case TSG_ASYNC_MESSAGE_SERVICE_MESSAGE: diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index d082844c2..c4b756439 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -325,15 +325,7 @@ BOOL transport_connect(rdpTransport* transport, const char* hostname, UINT16 por BOOL status = FALSE; rdpSettings* settings = transport->settings; - transport->async = transport->settings->AsyncTransport; - - if (transport->async) - { - transport->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - - transport->thread = CreateThread(NULL, 0, - (LPTHREAD_START_ROUTINE) transport_client_thread, transport, 0, NULL); - } + transport->async = settings->AsyncTransport; if (transport->settings->GatewayEnabled) { @@ -356,6 +348,17 @@ BOOL transport_connect(rdpTransport* transport, const char* hostname, UINT16 por transport->TcpOut = transport->TcpIn; } + if (status) + { + if (transport->async) + { + transport->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + + transport->thread = CreateThread(NULL, 0, + (LPTHREAD_START_ROUTINE) transport_client_thread, transport, 0, NULL); + } + } + return status; } From aea4960924dd6077828b5f4423e793852c6d93c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 1 Nov 2013 10:59:30 -0400 Subject: [PATCH 29/40] libfreerdp-core: get rid of rdpString in redirection module --- libfreerdp/core/connection.c | 10 ++-- libfreerdp/core/redirection.c | 96 +++++++++++++++++------------------ libfreerdp/core/redirection.h | 24 +++------ 3 files changed, 61 insertions(+), 69 deletions(-) diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index dff3e3952..cade9acd6 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -329,30 +329,30 @@ BOOL rdp_client_redirect(rdpRdp* rdp) if (redirection->flags & LB_TARGET_NET_ADDRESS) { free(settings->ServerHostname); - settings->ServerHostname = _strdup(redirection->targetNetAddress.ascii); + settings->ServerHostname = _strdup(redirection->TargetNetAddress); } else if (redirection->flags & LB_TARGET_FQDN) { free(settings->ServerHostname); - settings->ServerHostname = _strdup(redirection->targetFQDN.ascii); + settings->ServerHostname = _strdup(redirection->TargetFQDN); } else if (redirection->flags & LB_TARGET_NETBIOS_NAME) { free(settings->ServerHostname); - settings->ServerHostname = _strdup(redirection->targetNetBiosName.ascii); + settings->ServerHostname = _strdup(redirection->TargetNetBiosName); } } if (redirection->flags & LB_USERNAME) { free(settings->Username); - settings->Username = _strdup(redirection->username.ascii); + settings->Username = _strdup(redirection->Username); } if (redirection->flags & LB_DOMAIN) { free(settings->Domain); - settings->Domain = _strdup(redirection->domain.ascii); + settings->Domain = _strdup(redirection->Domain); } if (redirection->flags & LB_PASSWORD) diff --git a/libfreerdp/core/redirection.c b/libfreerdp/core/redirection.c index 4db501033..315b286dd 100644 --- a/libfreerdp/core/redirection.c +++ b/libfreerdp/core/redirection.c @@ -61,33 +61,23 @@ void rdp_print_redirection_flags(UINT32 flags) fprintf(stderr, "}\n"); } -BOOL rdp_string_read_length32(wStream* s, rdpString* string) +BOOL rdp_redirection_read_string(wStream* s, char** str) { - if(Stream_GetRemainingLength(s) < 4) + UINT32 length; + + if (Stream_GetRemainingLength(s) < 4) return FALSE; - Stream_Read_UINT32(s, string->length); + Stream_Read_UINT32(s, length); - if(Stream_GetRemainingLength(s) < string->length) + if (Stream_GetRemainingLength(s) < length) return FALSE; - string->unicode = (char*) malloc(string->length); - Stream_Read(s, string->unicode, string->length); - - ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) string->unicode, string->length / 2, &string->ascii, 0, NULL, NULL); + ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Buffer(s), length / 2, str, 0, NULL, NULL); return TRUE; } -void rdp_string_free(rdpString* string) -{ - if (string->unicode != NULL) - free(string->unicode); - - if (string->ascii != NULL) - free(string->ascii); -} - BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) { UINT16 flags; @@ -110,16 +100,17 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) if (redirection->flags & LB_TARGET_NET_ADDRESS) { - if (!rdp_string_read_length32(s, &redirection->targetNetAddress)) + if (!rdp_redirection_read_string(s, &(redirection->TargetNetAddress))) return FALSE; - DEBUG_REDIR("targetNetAddress: %s", redirection->targetNetAddress.ascii); } if (redirection->flags & LB_LOAD_BALANCE_INFO) { if (Stream_GetRemainingLength(s) < 4) return FALSE; + Stream_Read_UINT32(s, redirection->LoadBalanceInfoLength); + if (Stream_GetRemainingLength(s) < redirection->LoadBalanceInfoLength) return FALSE; @@ -133,16 +124,14 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) if (redirection->flags & LB_USERNAME) { - if (!rdp_string_read_length32(s, &redirection->username)) + if (!rdp_redirection_read_string(s, &(redirection->Username))) return FALSE; - DEBUG_REDIR("username: %s", redirection->username.ascii); } if (redirection->flags & LB_DOMAIN) { - if (!rdp_string_read_length32(s, &redirection->domain)) + if (!rdp_redirection_read_string(s, &(redirection->Domain))) return FALSE; - DEBUG_REDIR("domain: %s", redirection->domain.ascii); } if (redirection->flags & LB_PASSWORD) @@ -150,6 +139,7 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) /* Note: length (hopefully) includes double zero termination */ if (Stream_GetRemainingLength(s) < 4) return FALSE; + Stream_Read_UINT32(s, redirection->PasswordCookieLength); redirection->PasswordCookie = (BYTE*) malloc(redirection->PasswordCookieLength); Stream_Read(s, redirection->PasswordCookie, redirection->PasswordCookieLength); @@ -162,23 +152,20 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) if (redirection->flags & LB_TARGET_FQDN) { - if (!rdp_string_read_length32(s, &redirection->targetFQDN)) + if (!rdp_redirection_read_string(s, &(redirection->TargetFQDN))) return FALSE; - DEBUG_REDIR("targetFQDN: %s", redirection->targetFQDN.ascii); } if (redirection->flags & LB_TARGET_NETBIOS_NAME) { - if (!rdp_string_read_length32(s, &redirection->targetNetBiosName)) + if (!rdp_redirection_read_string(s, &(redirection->TargetNetBiosName))) return FALSE; - DEBUG_REDIR("targetNetBiosName: %s", redirection->targetNetBiosName.ascii); } if (redirection->flags & LB_CLIENT_TSV_URL) { - if (!rdp_string_read_length32(s, &redirection->tsvUrl)) + if (!rdp_redirection_read_string(s, &(redirection->TsvUrl))) return FALSE; - DEBUG_REDIR("tsvUrl: %s", redirection->tsvUrl.ascii); } if (redirection->flags & LB_TARGET_NET_ADDRESSES) @@ -189,19 +176,19 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) if (Stream_GetRemainingLength(s) < 8) return FALSE; + Stream_Read_UINT32(s, targetNetAddressesLength); - Stream_Read_UINT32(s, redirection->targetNetAddressesCount); - count = redirection->targetNetAddressesCount; + Stream_Read_UINT32(s, redirection->TargetNetAddressesCount); + count = redirection->TargetNetAddressesCount; - redirection->targetNetAddresses = (rdpString*) malloc(count * sizeof(rdpString)); - ZeroMemory(redirection->targetNetAddresses, count * sizeof(rdpString)); + redirection->TargetNetAddresses = (char**) malloc(count * sizeof(char*)); + ZeroMemory(redirection->TargetNetAddresses, count * sizeof(char*)); for (i = 0; i < (int) count; i++) { - if (!rdp_string_read_length32(s, &redirection->targetNetAddresses[i])) + if (!rdp_redirection_read_string(s, &(redirection->TargetNetAddresses[i]))) return FALSE; - DEBUG_REDIR("targetNetAddresses: %s", (&redirection->targetNetAddresses[i])->ascii); } } @@ -232,7 +219,7 @@ rdpRedirection* redirection_new() redirection = (rdpRedirection*) malloc(sizeof(rdpRedirection)); - if (redirection != NULL) + if (redirection) { ZeroMemory(redirection, sizeof(rdpRedirection)); } @@ -242,14 +229,25 @@ rdpRedirection* redirection_new() void redirection_free(rdpRedirection* redirection) { - if (redirection != NULL) + if (redirection) { - rdp_string_free(&redirection->tsvUrl); - rdp_string_free(&redirection->username); - rdp_string_free(&redirection->domain); - rdp_string_free(&redirection->targetFQDN); - rdp_string_free(&redirection->targetNetBiosName); - rdp_string_free(&redirection->targetNetAddress); + if (redirection->TsvUrl) + free(redirection->TsvUrl); + + if (redirection->Username) + free(redirection->Username); + + if (redirection->Domain) + free(redirection->Domain); + + if (redirection->TargetFQDN) + free(redirection->TargetFQDN); + + if (redirection->TargetNetBiosName) + free(redirection->TargetNetBiosName); + + if (redirection->TargetNetAddress) + free(redirection->TargetNetAddress); if (redirection->LoadBalanceInfo) free(redirection->LoadBalanceInfo); @@ -257,18 +255,20 @@ void redirection_free(rdpRedirection* redirection) if (redirection->PasswordCookie) free(redirection->PasswordCookie); - if (redirection->targetNetAddresses != NULL) + if (redirection->TargetNetAddresses) { int i; - for (i = 0; i < (int) redirection->targetNetAddressesCount; i++) - rdp_string_free(&redirection->targetNetAddresses[i]); + for (i = 0; i < (int) redirection->TargetNetAddressesCount; i++) + { + if (redirection->TargetNetAddresses[i]) + free(redirection->TargetNetAddresses[i]); + } - free(redirection->targetNetAddresses); + free(redirection->TargetNetAddresses); } free(redirection); } } - diff --git a/libfreerdp/core/redirection.h b/libfreerdp/core/redirection.h index 22bb2f15a..c441d08df 100644 --- a/libfreerdp/core/redirection.h +++ b/libfreerdp/core/redirection.h @@ -27,30 +27,22 @@ #include -struct rdp_string -{ - char* ascii; - char* unicode; - UINT32 length; -}; -typedef struct rdp_string rdpString; - struct rdp_redirection { UINT32 flags; UINT32 sessionID; - rdpString tsvUrl; - rdpString username; - rdpString domain; + char* TsvUrl; + char* Username; + char* Domain; BYTE* PasswordCookie; DWORD PasswordCookieLength; - rdpString targetFQDN; + char* TargetFQDN; BYTE* LoadBalanceInfo; DWORD LoadBalanceInfoLength; - rdpString targetNetBiosName; - rdpString targetNetAddress; - UINT32 targetNetAddressesCount; - rdpString* targetNetAddresses; + char* TargetNetBiosName; + char* TargetNetAddress; + UINT32 TargetNetAddressesCount; + char** TargetNetAddresses; }; typedef struct rdp_redirection rdpRedirection; From 1bada90ab7b3f8255785e35cc872d7db5513ff87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 1 Nov 2013 11:33:59 -0400 Subject: [PATCH 30/40] libfreerdp-core: fix redirection parsing bug, add logging --- libfreerdp/core/redirection.c | 30 ++++++++++++++++++++++++++---- libfreerdp/core/redirection.h | 2 ++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/libfreerdp/core/redirection.c b/libfreerdp/core/redirection.c index 315b286dd..d31204004 100644 --- a/libfreerdp/core/redirection.c +++ b/libfreerdp/core/redirection.c @@ -73,7 +73,7 @@ BOOL rdp_redirection_read_string(wStream* s, char** str) if (Stream_GetRemainingLength(s) < length) return FALSE; - ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Buffer(s), length / 2, str, 0, NULL, NULL); + ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Pointer(s), length / 2, str, 0, NULL, NULL); return TRUE; } @@ -92,7 +92,8 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) Stream_Read_UINT32(s, redirection->sessionID); /* sessionID (4 bytes) */ Stream_Read_UINT32(s, redirection->flags); /* redirFlags (4 bytes) */ - DEBUG_REDIR("flags: 0x%04X, length:%d, sessionID:0x%08X", flags, length, redirection->sessionID); + WLog_Print(redirection->log, WLOG_DEBUG, "flags: 0x%04X, length: %d, sessionID: 0x%08X", + flags, length, redirection->sessionID); #ifdef WITH_DEBUG_REDIR rdp_print_redirection_flags(redirection->flags); @@ -126,12 +127,16 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) { if (!rdp_redirection_read_string(s, &(redirection->Username))) return FALSE; + + WLog_Print(redirection->log, WLOG_DEBUG, "Username: %s", redirection->Username); } if (redirection->flags & LB_DOMAIN) { if (!rdp_redirection_read_string(s, &(redirection->Domain))) return FALSE; + + WLog_Print(redirection->log, WLOG_DEBUG, "Domain: %s", redirection->Domain); } if (redirection->flags & LB_PASSWORD) @@ -154,18 +159,24 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) { if (!rdp_redirection_read_string(s, &(redirection->TargetFQDN))) return FALSE; + + WLog_Print(redirection->log, WLOG_DEBUG, "TargetFQDN: %s", redirection->TargetFQDN); } if (redirection->flags & LB_TARGET_NETBIOS_NAME) { if (!rdp_redirection_read_string(s, &(redirection->TargetNetBiosName))) return FALSE; + + WLog_Print(redirection->log, WLOG_DEBUG, "TargetNetBiosName: %s", redirection->TargetNetBiosName); } if (redirection->flags & LB_CLIENT_TSV_URL) { if (!rdp_redirection_read_string(s, &(redirection->TsvUrl))) return FALSE; + + WLog_Print(redirection->log, WLOG_DEBUG, "TsvUrl: %s", redirection->TsvUrl); } if (redirection->flags & LB_TARGET_NET_ADDRESSES) @@ -185,10 +196,14 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) redirection->TargetNetAddresses = (char**) malloc(count * sizeof(char*)); ZeroMemory(redirection->TargetNetAddresses, count * sizeof(char*)); + WLog_Print(redirection->log, WLOG_DEBUG, "TargetNetAddressesCount: %d", redirection->TargetNetAddressesCount); + for (i = 0; i < (int) count; i++) { if (!rdp_redirection_read_string(s, &(redirection->TargetNetAddresses[i]))) return FALSE; + + WLog_Print(redirection->log, WLOG_DEBUG, "TargetNetAddresses[%d]: %s", i, redirection->TargetNetAddresses[i]); } } @@ -208,9 +223,9 @@ BOOL rdp_recv_redirection_packet(rdpRdp* rdp, wStream* s) BOOL rdp_recv_enhanced_security_redirection_packet(rdpRdp* rdp, wStream* s) { - return Stream_SafeSeek(s, 2) && /* pad2Octets (2 bytes) */ + return Stream_SafeSeek(s, 2) && /* pad2Octets (2 bytes) */ rdp_recv_server_redirection_pdu(rdp, s) && - Stream_SafeSeek(s, 1); /* pad2Octets (1 byte) */ + Stream_SafeSeek(s, 1); /* pad2Octets (1 byte) */ } rdpRedirection* redirection_new() @@ -222,6 +237,13 @@ rdpRedirection* redirection_new() if (redirection) { ZeroMemory(redirection, sizeof(rdpRedirection)); + + WLog_Init(); + redirection->log = WLog_Get("com.freerdp.core.redirection"); + +#ifdef WITH_DEBUG_REDIR + WLog_SetLogLevel(redirection->log, WLOG_TRACE); +#endif } return redirection; diff --git a/libfreerdp/core/redirection.h b/libfreerdp/core/redirection.h index c441d08df..8203336b1 100644 --- a/libfreerdp/core/redirection.h +++ b/libfreerdp/core/redirection.h @@ -25,10 +25,12 @@ #include #include +#include #include struct rdp_redirection { + wLog* log; UINT32 flags; UINT32 sessionID; char* TsvUrl; From 16f287015f1e03e3b3300e385dd83a352a8e354c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 1 Nov 2013 11:45:28 -0400 Subject: [PATCH 31/40] libfreerdp-core: fix redirection parsing bug --- libfreerdp/core/redirection.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libfreerdp/core/redirection.c b/libfreerdp/core/redirection.c index d31204004..f7adc808f 100644 --- a/libfreerdp/core/redirection.c +++ b/libfreerdp/core/redirection.c @@ -66,14 +66,21 @@ BOOL rdp_redirection_read_string(wStream* s, char** str) UINT32 length; if (Stream_GetRemainingLength(s) < 4) + { + fprintf(stderr, "rdp_redirection_read_string failure: cannot read length\n"); return FALSE; + } Stream_Read_UINT32(s, length); if (Stream_GetRemainingLength(s) < length) + { + fprintf(stderr, "rdp_redirection_read_string failure: incorrect length %d\n", length); return FALSE; + } ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Pointer(s), length / 2, str, 0, NULL, NULL); + Stream_Seek(s, length); return TRUE; } @@ -92,8 +99,8 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) Stream_Read_UINT32(s, redirection->sessionID); /* sessionID (4 bytes) */ Stream_Read_UINT32(s, redirection->flags); /* redirFlags (4 bytes) */ - WLog_Print(redirection->log, WLOG_DEBUG, "flags: 0x%04X, length: %d, sessionID: 0x%08X", - flags, length, redirection->sessionID); + WLog_Print(redirection->log, WLOG_DEBUG, "flags: 0x%04X, redirFlags: 0x%04X length: %d, sessionID: 0x%08X", + flags, redirection->flags, length, redirection->sessionID); #ifdef WITH_DEBUG_REDIR rdp_print_redirection_flags(redirection->flags); From 76414588b17236bfdf596ec92f4f9b68365a0b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 1 Nov 2013 14:13:09 -0400 Subject: [PATCH 32/40] libfreerdp-core: fix transport failure case with session redirection --- libfreerdp/core/connection.c | 15 +++++++++++++-- libfreerdp/core/fastpath.h | 4 ++-- libfreerdp/core/nego.c | 2 +- libfreerdp/core/rdp.c | 9 ++++++--- libfreerdp/core/rdp.h | 21 +++++++++++---------- libfreerdp/core/redirection.h | 3 ++- libfreerdp/core/settings.c | 6 +++--- libfreerdp/core/transport.c | 24 +++++++++++++++++------- 8 files changed, 55 insertions(+), 29 deletions(-) diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index cade9acd6..1f061c175 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -170,6 +170,14 @@ BOOL rdp_client_connect(rdpRdp* rdp) { rdpSettings* settings = rdp->settings; + if (rdp->settingsCopy) + { + freerdp_settings_free(rdp->settingsCopy); + rdp->settingsCopy = NULL; + } + + rdp->settingsCopy = freerdp_settings_clone(settings); + nego_init(rdp->nego); nego_set_target(rdp->nego, settings->ServerHostname, settings->ServerPort); @@ -278,6 +286,7 @@ BOOL rdp_client_disconnect(rdpRdp* rdp) BOOL rdp_client_redirect(rdpRdp* rdp) { + BOOL status; rdpSettings* settings = rdp->settings; rdpRedirection* redirection = rdp->redirection; @@ -297,7 +306,7 @@ BOOL rdp_client_redirect(rdpRdp* rdp) rdp->fips_hmac = NULL; free(settings->ServerRandom); - settings->ServerRandom = NULL ; + settings->ServerRandom = NULL; free(settings->ServerCertificate); settings->ServerCertificate = NULL; free(settings->ClientAddress); @@ -361,7 +370,9 @@ BOOL rdp_client_redirect(rdpRdp* rdp) settings->RedirectionPasswordLength = redirection->PasswordCookieLength; } - return rdp_client_connect(rdp); + status = rdp_client_connect(rdp); + + return status; } static BYTE fips_ivec[8] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; diff --git a/libfreerdp/core/fastpath.h b/libfreerdp/core/fastpath.h index 243196959..8efa162ec 100644 --- a/libfreerdp/core/fastpath.h +++ b/libfreerdp/core/fastpath.h @@ -20,12 +20,12 @@ #ifndef __FASTPATH_H #define __FASTPATH_H +typedef struct rdp_fastpath rdpFastPath; + #include "rdp.h" #include -typedef struct rdp_fastpath rdpFastPath; - enum FASTPATH_INPUT_ACTION_TYPE { FASTPATH_INPUT_ACTION_FASTPATH = 0x0, diff --git a/libfreerdp/core/nego.c b/libfreerdp/core/nego.c index 299cd7203..9fb281f85 100644 --- a/libfreerdp/core/nego.c +++ b/libfreerdp/core/nego.c @@ -964,7 +964,7 @@ void nego_init(rdpNego* nego) * @return */ -rdpNego* nego_new(struct rdp_transport * transport) +rdpNego* nego_new(rdpTransport* transport) { rdpNego* nego = (rdpNego*) malloc(sizeof(rdpNego)); diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index 2b795b64b..ffdd312ba 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -816,7 +816,7 @@ static int rdp_recv_tpkt_pdu(rdpRdp* rdp, wStream* s) */ Stream_Rewind(s, 2); rdp_recv_enhanced_security_redirection_packet(rdp, s); - return -1; + return 1; /* 1 = redirection */ } } @@ -976,7 +976,9 @@ void rdp_set_blocking_mode(rdpRdp* rdp, BOOL blocking) int rdp_check_fds(rdpRdp* rdp) { - return transport_check_fds(&(rdp->transport)); + int status; + status = transport_check_fds(&(rdp->transport)); + return status; } /** @@ -1035,7 +1037,7 @@ rdpRdp* rdp_new(rdpContext* context) void rdp_free(rdpRdp* rdp) { - if (rdp != NULL) + if (rdp) { crypto_rc4_free(rdp->rc4_decrypt_key); crypto_rc4_free(rdp->rc4_encrypt_key); @@ -1043,6 +1045,7 @@ void rdp_free(rdpRdp* rdp) crypto_des3_free(rdp->fips_decrypt); crypto_hmac_free(rdp->fips_hmac); freerdp_settings_free(rdp->settings); + freerdp_settings_free(rdp->settingsCopy); extension_free(rdp->extension); transport_free(rdp->transport); license_free(rdp->license); diff --git a/libfreerdp/core/rdp.h b/libfreerdp/core/rdp.h index aa43b988f..c70d0c3d8 100644 --- a/libfreerdp/core/rdp.h +++ b/libfreerdp/core/rdp.h @@ -121,16 +121,16 @@ struct rdp_rdp int state; freerdp* instance; rdpContext* context; - struct rdp_mcs* mcs; - struct rdp_nego* nego; - struct rdp_input* input; - struct rdp_update* update; - struct rdp_fastpath* fastpath; - struct rdp_license* license; - struct rdp_redirection* redirection; - struct rdp_settings* settings; - struct rdp_transport* transport; - struct rdp_extension* extension; + rdpMcs* mcs; + rdpNego* nego; + rdpInput* input; + rdpUpdate* update; + rdpFastPath* fastpath; + rdpLicense* license; + rdpRedirection* redirection; + rdpSettings* settings; + rdpTransport* transport; + rdpExtension* extension; struct rdp_mppc_dec* mppc_dec; struct rdp_mppc_enc* mppc_enc; struct crypto_rc4_struct* rc4_decrypt_key; @@ -160,6 +160,7 @@ struct rdp_rdp BOOL resendFocus; BOOL deactivation_reactivation; BOOL AwaitCapabilities; + rdpSettings* settingsCopy; }; BOOL rdp_read_security_header(wStream* s, UINT16* flags); diff --git a/libfreerdp/core/redirection.h b/libfreerdp/core/redirection.h index 8203336b1..b4f05e37f 100644 --- a/libfreerdp/core/redirection.h +++ b/libfreerdp/core/redirection.h @@ -20,6 +20,8 @@ #ifndef __REDIRECTION_H #define __REDIRECTION_H +typedef struct rdp_redirection rdpRedirection; + #include "rdp.h" #include @@ -46,7 +48,6 @@ struct rdp_redirection UINT32 TargetNetAddressesCount; char** TargetNetAddresses; }; -typedef struct rdp_redirection rdpRedirection; BOOL rdp_recv_redirection_packet(rdpRdp* rdp, wStream* s); BOOL rdp_recv_enhanced_security_redirection_packet(rdpRdp* rdp, wStream* s); diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index 6b0cd3f1c..1524afe76 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -301,6 +301,9 @@ rdpSettings* freerdp_settings_new(DWORD flags) ZeroMemory(settings->ClientHostname, 32); ZeroMemory(settings->ClientProductId, 32); + gethostname(settings->ClientHostname, 31); + settings->ClientHostname[31] = 0; + settings->ColorPointerFlag = TRUE; settings->LargePointerFlag = TRUE; settings->PointerCacheSize = 20; @@ -381,9 +384,6 @@ rdpSettings* freerdp_settings_new(DWORD flags) settings->FastPathOutput = TRUE; settings->FrameAcknowledge = 2; - - gethostname(settings->ClientHostname, 31); - settings->ClientHostname[31] = 0; settings->MouseMotion = TRUE; settings->AutoReconnectionEnabled = TRUE; diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index c4b756439..0d086e0d0 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -94,6 +94,7 @@ BOOL transport_disconnect(rdpTransport* transport) CloseHandle(transport->thread); CloseHandle(transport->stopEvent); } + return status; } @@ -889,23 +890,32 @@ int transport_check_fds(rdpTransport** ptransport) Stream_SealLength(received); Stream_SetPosition(received, 0); + /** + * status: + * -1: error + * 0: success + * 1: redirection + */ + recv_status = transport->ReceiveCallback(transport, received, transport->ReceiveExtra); - if (transport == *ptransport) + if (recv_status == 1) { - /* transport might now have been freed by rdp_client_redirect and a new rdp->transport created */ - /* so only release if still valid */ - Stream_Release(received); + /** + * Last call to ReceiveCallback resulted in a session redirection, + * which means the current rdpTransport* transport pointer has been freed. + * Return 0 for success, the rest of this function is meant for non-redirected cases. + */ + return 0; } + Stream_Release(received); + if (recv_status < 0) status = -1; if (status < 0) return status; - - /* transport might now have been freed by rdp_client_redirect and a new rdp->transport created */ - transport = *ptransport; } return 0; From cc301348df0acff69827f9ee23b817521a129300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 1 Nov 2013 18:32:36 -0400 Subject: [PATCH 33/40] libwinpr-crt: added SecureZeroMemory --- winpr/include/winpr/memory.h | 4 +++- winpr/libwinpr/crt/memory.c | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/winpr/include/winpr/memory.h b/winpr/include/winpr/memory.h index c8fbafd68..3a99685a8 100644 --- a/winpr/include/winpr/memory.h +++ b/winpr/include/winpr/memory.h @@ -30,9 +30,11 @@ #define CopyMemory(Destination, Source, Length) memcpy((Destination), (Source), (Length)) #define MoveMemory(Destination, Source, Length) memmove((Destination), (Source), (Length)) -#define FillMemory(Destination, Length, Fill) memset((Destination), (Fill), (Length)) +#define FillMemory(Destination, Length, Fill) memset((Destination), (Fill), (Length)) #define ZeroMemory(Destination, Length) memset((Destination), 0, (Length)) +WINPR_API PVOID SecureZeroMemory(PVOID ptr, SIZE_T cnt); + #endif #include diff --git a/winpr/libwinpr/crt/memory.c b/winpr/libwinpr/crt/memory.c index 39ac0dbe3..d83cf8493 100644 --- a/winpr/libwinpr/crt/memory.c +++ b/winpr/libwinpr/crt/memory.c @@ -28,6 +28,17 @@ #ifndef _WIN32 +PVOID SecureZeroMemory(PVOID ptr, SIZE_T cnt) +{ + volatile BYTE* p = ptr; + while (cnt--) + { + *p = 0; + p++; + } + + return ptr; +} #endif From 3caff4e4605de2d7ac61a4879b20f2a4c7d198a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 1 Nov 2013 20:23:56 -0400 Subject: [PATCH 34/40] libfreerdp-core: prevent multi-session crashes on Mac OS X --- channels/client/channels.c | 12 ++++-------- libfreerdp/core/tcp.c | 3 +++ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/channels/client/channels.c b/channels/client/channels.c index 2290b725c..6ed24df5e 100644 --- a/channels/client/channels.c +++ b/channels/client/channels.c @@ -74,10 +74,10 @@ CHANNEL_INIT_DATA g_ChannelInitData; static wArrayList* g_ChannelsList = NULL; /* To generate unique sequence for all open handles */ -int g_open_handle_sequence; +int g_open_handle_sequence = 1; /* For locking the global resources */ -static HANDLE g_mutex_init; +static HANDLE g_mutex_init = NULL; rdpChannels* freerdp_channels_find_by_open_handle(int open_handle, int* pindex) { @@ -324,8 +324,8 @@ UINT32 FreeRDP_VirtualChannelEventPush(UINT32 openHandle, wMessage* event) */ int freerdp_channels_global_init(void) { - g_open_handle_sequence = 1; - g_mutex_init = CreateMutex(NULL, FALSE, NULL); + if (!g_mutex_init) + g_mutex_init = CreateMutex(NULL, FALSE, NULL); if (!g_ChannelsList) g_ChannelsList = ArrayList_New(TRUE); @@ -335,10 +335,6 @@ int freerdp_channels_global_init(void) int freerdp_channels_global_uninit(void) { - /* TODO: free channels list */ - - CloseHandle(g_mutex_init); - return 0; } diff --git a/libfreerdp/core/tcp.c b/libfreerdp/core/tcp.c index 4b57a3354..34cf4cc35 100644 --- a/libfreerdp/core/tcp.c +++ b/libfreerdp/core/tcp.c @@ -269,6 +269,9 @@ int tcp_attach(rdpTcp* tcp, int sockfd) HANDLE tcp_get_event_handle(rdpTcp* tcp) { + if (!tcp) + return NULL; + #ifndef _WIN32 return tcp->event; #else From f34ab1277898797a5fb96e3ebbbf7a1d46cc2680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 3 Nov 2013 12:34:55 -0500 Subject: [PATCH 35/40] libfreerdp-core: fix leak in freerdp_settings_clone --- libfreerdp/core/settings.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index 1524afe76..b0a0e4e65 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -444,8 +444,8 @@ rdpSettings* freerdp_settings_clone(rdpSettings* settings) _settings->Username = _strdup(settings->Username); /* 21 */ _settings->Password = _strdup(settings->Password); /* 22 */ _settings->Domain = _strdup(settings->Domain); /* 23 */ - _settings->ClientHostname = _strdup(settings->ClientHostname); /* 134 */ - _settings->ClientProductId = _strdup(settings->ClientProductId); /* 135 */ + //_settings->ClientHostname = _strdup(settings->ClientHostname); /* 134 */ + //_settings->ClientProductId = _strdup(settings->ClientProductId); /* 135 */ _settings->AlternateShell = _strdup(settings->AlternateShell); /* 640 */ _settings->ShellWorkingDirectory = _strdup(settings->ShellWorkingDirectory); /* 641 */ _settings->ClientAddress = _strdup(settings->ClientAddress); /* 769 */ From 3e3c0f19427ec2c847d53a07a7cdda1d015ceaee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 3 Nov 2013 13:29:48 -0500 Subject: [PATCH 36/40] libfreerdp-core: fix potential asynchronous queuing memory problems for primary drawing orders --- libfreerdp/core/message.c | 30 +++++++++++++++++++++++++++++- libfreerdp/core/orders.c | 2 ++ libfreerdp/core/transport.c | 16 ++++++++++------ libfreerdp/core/update.c | 2 +- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/libfreerdp/core/message.c b/libfreerdp/core/message.c index 196092af5..b810fa1ad 100644 --- a/libfreerdp/core/message.c +++ b/libfreerdp/core/message.c @@ -217,6 +217,8 @@ static void update_message_PatBlt(rdpContext* context, PATBLT_ORDER* patBlt) wParam = (PATBLT_ORDER*) malloc(sizeof(PATBLT_ORDER)); CopyMemory(wParam, patBlt, sizeof(PATBLT_ORDER)); + wParam->brush.data = (BYTE*) wParam->brush.p8x8; + MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, PatBlt), (void*) wParam, NULL); } @@ -272,6 +274,8 @@ static void update_message_MultiPatBlt(rdpContext* context, MULTI_PATBLT_ORDER* wParam = (MULTI_PATBLT_ORDER*) malloc(sizeof(MULTI_PATBLT_ORDER)); CopyMemory(wParam, multiPatBlt, sizeof(MULTI_PATBLT_ORDER)); + wParam->brush.data = (BYTE*) wParam->brush.p8x8; + MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, MultiPatBlt), (void*) wParam, NULL); } @@ -354,6 +358,8 @@ static void update_message_Mem3Blt(rdpContext* context, MEM3BLT_ORDER* mem3Blt) wParam = (MEM3BLT_ORDER*) malloc(sizeof(MEM3BLT_ORDER)); CopyMemory(wParam, mem3Blt, sizeof(MEM3BLT_ORDER)); + wParam->brush.data = (BYTE*) wParam->brush.p8x8; + MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, Mem3Blt), (void*) wParam, NULL); } @@ -376,6 +382,8 @@ static void update_message_GlyphIndex(rdpContext* context, GLYPH_INDEX_ORDER* gl wParam = (GLYPH_INDEX_ORDER*) malloc(sizeof(GLYPH_INDEX_ORDER)); CopyMemory(wParam, glyphIndex, sizeof(GLYPH_INDEX_ORDER)); + wParam->brush.data = (BYTE*) wParam->brush.p8x8; + MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, GlyphIndex), (void*) wParam, NULL); } @@ -398,6 +406,16 @@ static void update_message_FastGlyph(rdpContext* context, FAST_GLYPH_ORDER* fast wParam = (FAST_GLYPH_ORDER*) malloc(sizeof(FAST_GLYPH_ORDER)); CopyMemory(wParam, fastGlyph, sizeof(FAST_GLYPH_ORDER)); + if (wParam->cbData > 1) + { + wParam->glyphData.aj = (BYTE*) malloc(fastGlyph->glyphData.cb); + CopyMemory(wParam->glyphData.aj, fastGlyph->glyphData.aj, fastGlyph->glyphData.cb); + } + else + { + wParam->glyphData.aj = NULL; + } + MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, FastGlyph), (void*) wParam, NULL); } @@ -426,6 +444,8 @@ static void update_message_PolygonCB(rdpContext* context, POLYGON_CB_ORDER* poly wParam->points = (DELTA_POINT*) malloc(sizeof(DELTA_POINT) * wParam->numPoints); CopyMemory(wParam->points, polygonCB, sizeof(DELTA_POINT) * wParam->numPoints); + wParam->brush.data = (BYTE*) wParam->brush.p8x8; + MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, PolygonCB), (void*) wParam, NULL); } @@ -448,6 +468,8 @@ static void update_message_EllipseCB(rdpContext* context, ELLIPSE_CB_ORDER* elli wParam = (ELLIPSE_CB_ORDER*) malloc(sizeof(ELLIPSE_CB_ORDER)); CopyMemory(wParam, ellipseCB, sizeof(ELLIPSE_CB_ORDER)); + wParam->brush.data = (BYTE*) wParam->brush.p8x8; + MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, EllipseCB), (void*) wParam, NULL); } @@ -994,6 +1016,7 @@ int update_message_process_update_class(rdpUpdateProxy* proxy, wMessage* msg, in #endif } + free(wParam->rectangles); free(wParam); } break; @@ -1159,7 +1182,12 @@ int update_message_process_primary_update_class(rdpUpdateProxy* proxy, wMessage* case PrimaryUpdate_FastGlyph: IFCALL(proxy->FastGlyph, msg->context, (FAST_GLYPH_ORDER*) msg->wParam); - free(msg->wParam); + { + FAST_GLYPH_ORDER* wParam = (FAST_GLYPH_ORDER*) msg->wParam; + if (wParam->glyphData.aj) + free(wParam->glyphData.aj); + free(wParam); + } break; case PrimaryUpdate_PolygonSC: diff --git a/libfreerdp/core/orders.c b/libfreerdp/core/orders.c index 6fb547d9d..5836da631 100644 --- a/libfreerdp/core/orders.c +++ b/libfreerdp/core/orders.c @@ -1356,6 +1356,7 @@ BOOL update_read_memblt_order(wStream* s, ORDER_INFO* orderInfo, MEMBLT_ORDER* m memblt->colorIndex = (memblt->cacheId >> 8); memblt->cacheId = (memblt->cacheId & 0xFF); + memblt->bitmap = NULL; return TRUE; } @@ -1422,6 +1423,7 @@ BOOL update_read_mem3blt_order(wStream* s, ORDER_INFO* orderInfo, MEM3BLT_ORDER* ORDER_FIELD_UINT16(16, mem3blt->cacheIndex); mem3blt->colorIndex = (mem3blt->cacheId >> 8); mem3blt->cacheId = (mem3blt->cacheId & 0xFF); + mem3blt->bitmap = NULL; return TRUE; } diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 0d086e0d0..f6fdf2d56 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -88,11 +88,17 @@ BOOL transport_disconnect(rdpTransport* transport) if (transport->async) { - SetEvent(transport->stopEvent); - WaitForSingleObject(transport->thread, INFINITE); + if (transport->stopEvent) + { + SetEvent(transport->stopEvent); + WaitForSingleObject(transport->thread, INFINITE); - CloseHandle(transport->thread); - CloseHandle(transport->stopEvent); + CloseHandle(transport->thread); + CloseHandle(transport->stopEvent); + + transport->thread = NULL; + transport->stopEvent = NULL; + } } return status; @@ -1035,8 +1041,6 @@ void transport_free(rdpTransport* transport) { if (transport) { - SetEvent(transport->stopEvent); - if (transport->ReceiveBuffer) Stream_Release(transport->ReceiveBuffer); diff --git a/libfreerdp/core/update.c b/libfreerdp/core/update.c index 14d6bb1f9..49077aec6 100644 --- a/libfreerdp/core/update.c +++ b/libfreerdp/core/update.c @@ -1612,7 +1612,7 @@ void update_free(rdpUpdate* update) free(update->primary->polyline.points); free(update->primary->polygon_sc.points); - if (NULL != update->primary->fast_glyph.glyphData.aj) + if (update->primary->fast_glyph.glyphData.aj) free(update->primary->fast_glyph.glyphData.aj); free(update->primary); From edb218df905ca742ed059729ec8633258e74c45d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 3 Nov 2013 13:51:41 -0500 Subject: [PATCH 37/40] libfreerdp-cache: refactor code style --- libfreerdp/cache/bitmap.c | 129 ++++++++++++++++++----------------- libfreerdp/cache/brush.c | 97 +++++++++++++------------- libfreerdp/cache/offscreen.c | 95 +++++++++++++------------- libfreerdp/cache/palette.c | 61 +++++++++-------- 4 files changed, 197 insertions(+), 185 deletions(-) diff --git a/libfreerdp/cache/bitmap.c b/libfreerdp/cache/bitmap.c index fcd653b5f..18e8b76d8 100644 --- a/libfreerdp/cache/bitmap.c +++ b/libfreerdp/cache/bitmap.c @@ -58,8 +58,10 @@ void update_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) bitmap = offscreen_cache_get(cache->offscreen, mem3blt->cacheIndex); else bitmap = bitmap_cache_get(cache->bitmap, (BYTE) mem3blt->cacheId, mem3blt->cacheIndex); + /* XP-SP2 servers sometimes ask for cached bitmaps they've never defined. */ - if (bitmap == NULL) return; + if (!bitmap) + return; style = brush->style; @@ -74,7 +76,7 @@ void update_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) brush->style = style; } -void update_gdi_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cache_bitmap) +void update_gdi_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cacheBitmap) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; @@ -82,24 +84,24 @@ void update_gdi_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cache_bitm bitmap = Bitmap_Alloc(context); - Bitmap_SetDimensions(context, bitmap, cache_bitmap->bitmapWidth, cache_bitmap->bitmapHeight); + Bitmap_SetDimensions(context, bitmap, cacheBitmap->bitmapWidth, cacheBitmap->bitmapHeight); bitmap->Decompress(context, bitmap, - cache_bitmap->bitmapDataStream, cache_bitmap->bitmapWidth, cache_bitmap->bitmapHeight, - cache_bitmap->bitmapBpp, cache_bitmap->bitmapLength, - cache_bitmap->compressed, RDP_CODEC_ID_NONE); + cacheBitmap->bitmapDataStream, cacheBitmap->bitmapWidth, cacheBitmap->bitmapHeight, + cacheBitmap->bitmapBpp, cacheBitmap->bitmapLength, + cacheBitmap->compressed, RDP_CODEC_ID_NONE); bitmap->New(context, bitmap); - prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap->cacheId, cache_bitmap->cacheIndex); + prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmap->cacheId, cacheBitmap->cacheIndex); if (prevBitmap != NULL) Bitmap_Free(context, prevBitmap); - bitmap_cache_put(cache->bitmap, cache_bitmap->cacheId, cache_bitmap->cacheIndex, bitmap); + bitmap_cache_put(cache->bitmap, cacheBitmap->cacheId, cacheBitmap->cacheIndex, bitmap); } -void update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2) +void update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cacheBitmapV2) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; @@ -107,44 +109,44 @@ void update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cach bitmap = Bitmap_Alloc(context); - Bitmap_SetDimensions(context, bitmap, cache_bitmap_v2->bitmapWidth, cache_bitmap_v2->bitmapHeight); + Bitmap_SetDimensions(context, bitmap, cacheBitmapV2->bitmapWidth, cacheBitmapV2->bitmapHeight); - if (cache_bitmap_v2->bitmapBpp == 0) + if (cacheBitmapV2->bitmapBpp == 0) { /* Workaround for Windows 8 bug where bitmapBpp is not set */ - cache_bitmap_v2->bitmapBpp = context->instance->settings->ColorDepth; + cacheBitmapV2->bitmapBpp = context->instance->settings->ColorDepth; } bitmap->Decompress(context, bitmap, - cache_bitmap_v2->bitmapDataStream, cache_bitmap_v2->bitmapWidth, cache_bitmap_v2->bitmapHeight, - cache_bitmap_v2->bitmapBpp, cache_bitmap_v2->bitmapLength, - cache_bitmap_v2->compressed, RDP_CODEC_ID_NONE); + cacheBitmapV2->bitmapDataStream, cacheBitmapV2->bitmapWidth, cacheBitmapV2->bitmapHeight, + cacheBitmapV2->bitmapBpp, cacheBitmapV2->bitmapLength, + cacheBitmapV2->compressed, RDP_CODEC_ID_NONE); bitmap->New(context, bitmap); - prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap_v2->cacheId, cache_bitmap_v2->cacheIndex); + prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmapV2->cacheId, cacheBitmapV2->cacheIndex); if (prevBitmap != NULL) Bitmap_Free(context, prevBitmap); - bitmap_cache_put(cache->bitmap, cache_bitmap_v2->cacheId, cache_bitmap_v2->cacheIndex, bitmap); + bitmap_cache_put(cache->bitmap, cacheBitmapV2->cacheId, cacheBitmapV2->cacheIndex, bitmap); } -void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3) +void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; rdpCache* cache = context->cache; - BITMAP_DATA_EX* bitmapData = &cache_bitmap_v3->bitmapData; + BITMAP_DATA_EX* bitmapData = &cacheBitmapV3->bitmapData; bitmap = Bitmap_Alloc(context); Bitmap_SetDimensions(context, bitmap, bitmapData->width, bitmapData->height); - if (cache_bitmap_v3->bitmapData.bpp == 0) + if (cacheBitmapV3->bitmapData.bpp == 0) { /* Workaround for Windows 8 bug where bitmapBpp is not set */ - cache_bitmap_v3->bitmapData.bpp = context->instance->settings->ColorDepth; + cacheBitmapV3->bitmapData.bpp = context->instance->settings->ColorDepth; } bitmap->Decompress(context, bitmap, @@ -154,15 +156,15 @@ void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cach bitmap->New(context, bitmap); - prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap_v3->cacheId, cache_bitmap_v3->cacheIndex); + prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex); if (prevBitmap != NULL) Bitmap_Free(context, prevBitmap); - bitmap_cache_put(cache->bitmap, cache_bitmap_v3->cacheId, cache_bitmap_v3->cacheIndex, bitmap); + bitmap_cache_put(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex, bitmap); } -void update_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmap_update) +void update_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) { int i; rdpBitmap* bitmap; @@ -170,7 +172,7 @@ void update_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmap_update) BOOL reused = TRUE; rdpCache* cache = context->cache; - if (cache->bitmap->bitmap == NULL) + if (!cache->bitmap->bitmap) { cache->bitmap->bitmap = Bitmap_Alloc(context); cache->bitmap->bitmap->ephemeral = TRUE; @@ -179,9 +181,9 @@ void update_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmap_update) bitmap = cache->bitmap->bitmap; - for (i = 0; i < (int) bitmap_update->number; i++) + for (i = 0; i < (int) bitmapUpdate->number; i++) { - bitmap_data = &bitmap_update->rectangles[i]; + bitmap_data = &bitmapUpdate->rectangles[i]; bitmap->bpp = bitmap_data->bitsPerPixel; bitmap->length = bitmap_data->bitmapLength; @@ -209,11 +211,11 @@ void update_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmap_update) } } -rdpBitmap* bitmap_cache_get(rdpBitmapCache* bitmap_cache, UINT32 id, UINT32 index) +rdpBitmap* bitmap_cache_get(rdpBitmapCache* bitmapCache, UINT32 id, UINT32 index) { rdpBitmap* bitmap; - if (id > bitmap_cache->maxCells) + if (id > bitmapCache->maxCells) { fprintf(stderr, "get invalid bitmap cell id: %d\n", id); return NULL; @@ -221,22 +223,22 @@ rdpBitmap* bitmap_cache_get(rdpBitmapCache* bitmap_cache, UINT32 id, UINT32 inde if (index == BITMAP_CACHE_WAITING_LIST_INDEX) { - index = bitmap_cache->cells[id].number; + index = bitmapCache->cells[id].number; } - else if (index > bitmap_cache->cells[id].number) + else if (index > bitmapCache->cells[id].number) { fprintf(stderr, "get invalid bitmap index %d in cell id: %d\n", index, id); return NULL; } - bitmap = bitmap_cache->cells[id].entries[index]; + bitmap = bitmapCache->cells[id].entries[index]; return bitmap; } -void bitmap_cache_put(rdpBitmapCache* bitmap_cache, UINT32 id, UINT32 index, rdpBitmap* bitmap) +void bitmap_cache_put(rdpBitmapCache* bitmapCache, UINT32 id, UINT32 index, rdpBitmap* bitmap) { - if (id > bitmap_cache->maxCells) + if (id > bitmapCache->maxCells) { fprintf(stderr, "put invalid bitmap cell id: %d\n", id); return; @@ -244,15 +246,15 @@ void bitmap_cache_put(rdpBitmapCache* bitmap_cache, UINT32 id, UINT32 index, rdp if (index == BITMAP_CACHE_WAITING_LIST_INDEX) { - index = bitmap_cache->cells[id].number; + index = bitmapCache->cells[id].number; } - else if (index > bitmap_cache->cells[id].number) + else if (index > bitmapCache->cells[id].number) { fprintf(stderr, "put invalid bitmap index %d in cell id: %d\n", index, id); return; } - bitmap_cache->cells[id].entries[index] = bitmap; + bitmapCache->cells[id].entries[index] = bitmap; } void bitmap_cache_register_callbacks(rdpUpdate* update) @@ -275,60 +277,61 @@ void bitmap_cache_register_callbacks(rdpUpdate* update) rdpBitmapCache* bitmap_cache_new(rdpSettings* settings) { int i; - rdpBitmapCache* bitmap_cache; + rdpBitmapCache* bitmapCache; - bitmap_cache = (rdpBitmapCache*) malloc(sizeof(rdpBitmapCache)); - ZeroMemory(bitmap_cache, sizeof(rdpBitmapCache)); + bitmapCache = (rdpBitmapCache*) malloc(sizeof(rdpBitmapCache)); - if (bitmap_cache != NULL) + if (bitmapCache) { - bitmap_cache->settings = settings; - bitmap_cache->update = ((freerdp*) settings->instance)->update; - bitmap_cache->context = bitmap_cache->update->context; + ZeroMemory(bitmapCache, sizeof(rdpBitmapCache)); - bitmap_cache->maxCells = settings->BitmapCacheV2NumCells; + bitmapCache->settings = settings; + bitmapCache->update = ((freerdp*) settings->instance)->update; + bitmapCache->context = bitmapCache->update->context; - bitmap_cache->cells = (BITMAP_V2_CELL*) malloc(sizeof(BITMAP_V2_CELL) * bitmap_cache->maxCells); - ZeroMemory(bitmap_cache->cells, sizeof(BITMAP_V2_CELL) * bitmap_cache->maxCells); + bitmapCache->maxCells = settings->BitmapCacheV2NumCells; - for (i = 0; i < (int) bitmap_cache->maxCells; i++) + bitmapCache->cells = (BITMAP_V2_CELL*) malloc(sizeof(BITMAP_V2_CELL) * bitmapCache->maxCells); + ZeroMemory(bitmapCache->cells, sizeof(BITMAP_V2_CELL) * bitmapCache->maxCells); + + for (i = 0; i < (int) bitmapCache->maxCells; i++) { - bitmap_cache->cells[i].number = settings->BitmapCacheV2CellInfo[i].numEntries; + bitmapCache->cells[i].number = settings->BitmapCacheV2CellInfo[i].numEntries; /* allocate an extra entry for BITMAP_CACHE_WAITING_LIST_INDEX */ - bitmap_cache->cells[i].entries = (rdpBitmap**) malloc(sizeof(rdpBitmap*) * (bitmap_cache->cells[i].number + 1)); - ZeroMemory(bitmap_cache->cells[i].entries, sizeof(rdpBitmap*) * (bitmap_cache->cells[i].number + 1)); + bitmapCache->cells[i].entries = (rdpBitmap**) malloc(sizeof(rdpBitmap*) * (bitmapCache->cells[i].number + 1)); + ZeroMemory(bitmapCache->cells[i].entries, sizeof(rdpBitmap*) * (bitmapCache->cells[i].number + 1)); } } - return bitmap_cache; + return bitmapCache; } -void bitmap_cache_free(rdpBitmapCache* bitmap_cache) +void bitmap_cache_free(rdpBitmapCache* bitmapCache) { int i, j; rdpBitmap* bitmap; - if (bitmap_cache != NULL) + if (bitmapCache != NULL) { - for (i = 0; i < (int) bitmap_cache->maxCells; i++) + for (i = 0; i < (int) bitmapCache->maxCells; i++) { - for (j = 0; j < (int) bitmap_cache->cells[i].number + 1; j++) + for (j = 0; j < (int) bitmapCache->cells[i].number + 1; j++) { - bitmap = bitmap_cache->cells[i].entries[j]; + bitmap = bitmapCache->cells[i].entries[j]; if (bitmap != NULL) { - Bitmap_Free(bitmap_cache->context, bitmap); + Bitmap_Free(bitmapCache->context, bitmap); } } - free(bitmap_cache->cells[i].entries); + free(bitmapCache->cells[i].entries); } - if (bitmap_cache->bitmap != NULL) - Bitmap_Free(bitmap_cache->context, bitmap_cache->bitmap); + if (bitmapCache->bitmap) + Bitmap_Free(bitmapCache->context, bitmapCache->bitmap); - free(bitmap_cache->cells); - free(bitmap_cache); + free(bitmapCache->cells); + free(bitmapCache); } } diff --git a/libfreerdp/cache/brush.c b/libfreerdp/cache/brush.c index b4e5373c1..b5e54f89c 100644 --- a/libfreerdp/cache/brush.c +++ b/libfreerdp/cache/brush.c @@ -73,48 +73,48 @@ void update_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) brush->style = style; } -static void update_gdi_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cache_brush) +static void update_gdi_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cacheBrush) { int length; void* data = NULL; rdpCache* cache = context->cache; - length = cache_brush->bpp * 64 / 8; + length = cacheBrush->bpp * 64 / 8; data = malloc(length); - CopyMemory(data, cache_brush->data, length); + CopyMemory(data, cacheBrush->data, length); - brush_cache_put(cache->brush, cache_brush->index, data, cache_brush->bpp); + brush_cache_put(cache->brush, cacheBrush->index, data, cacheBrush->bpp); } -void* brush_cache_get(rdpBrushCache* brush, UINT32 index, UINT32* bpp) +void* brush_cache_get(rdpBrushCache* brushCache, UINT32 index, UINT32* bpp) { void* entry; - assert(brush); + assert(brushCache); assert(bpp); if (*bpp == 1) { - if (index >= brush->maxMonoEntries) + if (index >= brushCache->maxMonoEntries) { fprintf(stderr, "invalid brush (%d bpp) index: 0x%04X\n", *bpp, index); return NULL; } - *bpp = brush->monoEntries[index].bpp; - entry = brush->monoEntries[index].entry; + *bpp = brushCache->monoEntries[index].bpp; + entry = brushCache->monoEntries[index].entry; } else { - if (index >= brush->maxEntries) + if (index >= brushCache->maxEntries) { fprintf(stderr, "invalid brush (%d bpp) index: 0x%04X\n", *bpp, index); return NULL; } - *bpp = brush->entries[index].bpp; - entry = brush->entries[index].entry; + *bpp = brushCache->entries[index].bpp; + entry = brushCache->entries[index].entry; } if (entry == NULL) @@ -126,45 +126,49 @@ void* brush_cache_get(rdpBrushCache* brush, UINT32 index, UINT32* bpp) return entry; } -void brush_cache_put(rdpBrushCache* brush, UINT32 index, void* entry, UINT32 bpp) +void brush_cache_put(rdpBrushCache* brushCache, UINT32 index, void* entry, UINT32 bpp) { void* prevEntry; if (bpp == 1) { - if (index >= brush->maxMonoEntries) + if (index >= brushCache->maxMonoEntries) { fprintf(stderr, "invalid brush (%d bpp) index: 0x%04X\n", bpp, index); + if (entry) free(entry); + return; } - prevEntry = brush->monoEntries[index].entry; + prevEntry = brushCache->monoEntries[index].entry; if (prevEntry != NULL) free(prevEntry); - brush->monoEntries[index].bpp = bpp; - brush->monoEntries[index].entry = entry; + brushCache->monoEntries[index].bpp = bpp; + brushCache->monoEntries[index].entry = entry; } else { - if (index >= brush->maxEntries) + if (index >= brushCache->maxEntries) { fprintf(stderr, "invalid brush (%d bpp) index: 0x%04X\n", bpp, index); + if (entry) free(entry); + return; } - prevEntry = brush->entries[index].entry; + prevEntry = brushCache->entries[index].entry; if (prevEntry != NULL) free(prevEntry); - brush->entries[index].bpp = bpp; - brush->entries[index].entry = entry; + brushCache->entries[index].bpp = bpp; + brushCache->entries[index].entry = entry; } } @@ -184,56 +188,57 @@ void brush_cache_register_callbacks(rdpUpdate* update) rdpBrushCache* brush_cache_new(rdpSettings* settings) { - rdpBrushCache* brush; + rdpBrushCache* brushCache; - brush = (rdpBrushCache*) malloc(sizeof(rdpBrushCache)); - ZeroMemory(brush, sizeof(rdpBrushCache)); + brushCache = (rdpBrushCache*) malloc(sizeof(rdpBrushCache)); - if (brush != NULL) + if (brushCache) { - brush->settings = settings; + ZeroMemory(brushCache, sizeof(rdpBrushCache)); - brush->maxEntries = 64; - brush->maxMonoEntries = 64; + brushCache->settings = settings; - brush->entries = (BRUSH_ENTRY*) malloc(sizeof(BRUSH_ENTRY) * brush->maxEntries); - ZeroMemory(brush->entries, sizeof(BRUSH_ENTRY) * brush->maxEntries); + brushCache->maxEntries = 64; + brushCache->maxMonoEntries = 64; - brush->monoEntries = (BRUSH_ENTRY*) malloc(sizeof(BRUSH_ENTRY) * brush->maxMonoEntries); - ZeroMemory(brush->monoEntries, sizeof(BRUSH_ENTRY) * brush->maxMonoEntries); + brushCache->entries = (BRUSH_ENTRY*) malloc(sizeof(BRUSH_ENTRY) * brushCache->maxEntries); + ZeroMemory(brushCache->entries, sizeof(BRUSH_ENTRY) * brushCache->maxEntries); + + brushCache->monoEntries = (BRUSH_ENTRY*) malloc(sizeof(BRUSH_ENTRY) * brushCache->maxMonoEntries); + ZeroMemory(brushCache->monoEntries, sizeof(BRUSH_ENTRY) * brushCache->maxMonoEntries); } - return brush; + return brushCache; } -void brush_cache_free(rdpBrushCache* brush) +void brush_cache_free(rdpBrushCache* brushCache) { int i; - if (brush != NULL) + if (brushCache) { - if (brush->entries != NULL) + if (brushCache->entries) { - for (i = 0; i < (int) brush->maxEntries; i++) + for (i = 0; i < (int) brushCache->maxEntries; i++) { - if (brush->entries[i].entry != NULL) - free(brush->entries[i].entry); + if (brushCache->entries[i].entry != NULL) + free(brushCache->entries[i].entry); } - free(brush->entries); + free(brushCache->entries); } - if (brush->monoEntries != NULL) + if (brushCache->monoEntries) { - for (i = 0; i < (int) brush->maxMonoEntries; i++) + for (i = 0; i < (int) brushCache->maxMonoEntries; i++) { - if (brush->monoEntries[i].entry != NULL) - free(brush->monoEntries[i].entry); + if (brushCache->monoEntries[i].entry != NULL) + free(brushCache->monoEntries[i].entry); } - free(brush->monoEntries); + free(brushCache->monoEntries); } - free(brush); + free(brushCache); } } diff --git a/libfreerdp/cache/offscreen.c b/libfreerdp/cache/offscreen.c index ebca2d896..c735f96d3 100644 --- a/libfreerdp/cache/offscreen.c +++ b/libfreerdp/cache/offscreen.c @@ -29,7 +29,7 @@ #include -void update_gdi_create_offscreen_bitmap(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) +void update_gdi_create_offscreen_bitmap(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* createOffscreenBitmap) { int i; UINT16 index; @@ -38,55 +38,55 @@ void update_gdi_create_offscreen_bitmap(rdpContext* context, CREATE_OFFSCREEN_BI bitmap = Bitmap_Alloc(context); - bitmap->width = create_offscreen_bitmap->cx; - bitmap->height = create_offscreen_bitmap->cy; + bitmap->width = createOffscreenBitmap->cx; + bitmap->height = createOffscreenBitmap->cy; bitmap->New(context, bitmap); - offscreen_cache_delete(cache->offscreen, create_offscreen_bitmap->id); - offscreen_cache_put(cache->offscreen, create_offscreen_bitmap->id, bitmap); + offscreen_cache_delete(cache->offscreen, createOffscreenBitmap->id); + offscreen_cache_put(cache->offscreen, createOffscreenBitmap->id, bitmap); - if(cache->offscreen->currentSurface == create_offscreen_bitmap->id) + if(cache->offscreen->currentSurface == createOffscreenBitmap->id) Bitmap_SetSurface(context, bitmap, FALSE); - for (i = 0; i < (int) create_offscreen_bitmap->deleteList.cIndices; i++) + for (i = 0; i < (int) createOffscreenBitmap->deleteList.cIndices; i++) { - index = create_offscreen_bitmap->deleteList.indices[i]; + index = createOffscreenBitmap->deleteList.indices[i]; offscreen_cache_delete(cache->offscreen, index); } } -void update_gdi_switch_surface(rdpContext* context, SWITCH_SURFACE_ORDER* switch_surface) +void update_gdi_switch_surface(rdpContext* context, SWITCH_SURFACE_ORDER* switchSurface) { rdpCache* cache = context->cache; - if (switch_surface->bitmapId == SCREEN_BITMAP_SURFACE) + if (switchSurface->bitmapId == SCREEN_BITMAP_SURFACE) { Bitmap_SetSurface(context, NULL, TRUE); } else { rdpBitmap* bitmap; - bitmap = offscreen_cache_get(cache->offscreen, switch_surface->bitmapId); + bitmap = offscreen_cache_get(cache->offscreen, switchSurface->bitmapId); Bitmap_SetSurface(context, bitmap, FALSE); } - cache->offscreen->currentSurface = switch_surface->bitmapId; + cache->offscreen->currentSurface = switchSurface->bitmapId; } -rdpBitmap* offscreen_cache_get(rdpOffscreenCache* offscreen_cache, UINT32 index) +rdpBitmap* offscreen_cache_get(rdpOffscreenCache* offscreenCache, UINT32 index) { rdpBitmap* bitmap; - if (index >= offscreen_cache->maxEntries) + if (index >= offscreenCache->maxEntries) { fprintf(stderr, "invalid offscreen bitmap index: 0x%04X\n", index); return NULL; } - bitmap = offscreen_cache->entries[index]; + bitmap = offscreenCache->entries[index]; - if (bitmap == NULL) + if (!bitmap) { fprintf(stderr, "invalid offscreen bitmap at index: 0x%04X\n", index); return NULL; @@ -95,34 +95,34 @@ rdpBitmap* offscreen_cache_get(rdpOffscreenCache* offscreen_cache, UINT32 index) return bitmap; } -void offscreen_cache_put(rdpOffscreenCache* offscreen, UINT32 index, rdpBitmap* bitmap) +void offscreen_cache_put(rdpOffscreenCache* offscreenCache, UINT32 index, rdpBitmap* bitmap) { - if (index >= offscreen->maxEntries) + if (index >= offscreenCache->maxEntries) { fprintf(stderr, "invalid offscreen bitmap index: 0x%04X\n", index); return; } - offscreen_cache_delete(offscreen, index); - offscreen->entries[index] = bitmap; + offscreen_cache_delete(offscreenCache, index); + offscreenCache->entries[index] = bitmap; } -void offscreen_cache_delete(rdpOffscreenCache* offscreen, UINT32 index) +void offscreen_cache_delete(rdpOffscreenCache* offscreenCache, UINT32 index) { rdpBitmap* prevBitmap; - if (index >= offscreen->maxEntries) + if (index >= offscreenCache->maxEntries) { fprintf(stderr, "invalid offscreen bitmap index (delete): 0x%04X\n", index); return; } - prevBitmap = offscreen->entries[index]; + prevBitmap = offscreenCache->entries[index]; if (prevBitmap != NULL) - Bitmap_Free(offscreen->update->context, prevBitmap); + Bitmap_Free(offscreenCache->update->context, prevBitmap); - offscreen->entries[index] = NULL; + offscreenCache->entries[index] = NULL; } void offscreen_cache_register_callbacks(rdpUpdate* update) @@ -133,46 +133,47 @@ void offscreen_cache_register_callbacks(rdpUpdate* update) rdpOffscreenCache* offscreen_cache_new(rdpSettings* settings) { - rdpOffscreenCache* offscreen_cache; + rdpOffscreenCache* offscreenCache; - offscreen_cache = (rdpOffscreenCache*) malloc(sizeof(rdpOffscreenCache)); - ZeroMemory(offscreen_cache, sizeof(rdpOffscreenCache)); + offscreenCache = (rdpOffscreenCache*) malloc(sizeof(rdpOffscreenCache)); - if (offscreen_cache != NULL) + if (offscreenCache) { - offscreen_cache->settings = settings; - offscreen_cache->update = ((freerdp*) settings->instance)->update; + ZeroMemory(offscreenCache, sizeof(rdpOffscreenCache)); - offscreen_cache->currentSurface = SCREEN_BITMAP_SURFACE; - offscreen_cache->maxSize = 7680; - offscreen_cache->maxEntries = 2000; + offscreenCache->settings = settings; + offscreenCache->update = ((freerdp*) settings->instance)->update; - settings->OffscreenCacheSize = offscreen_cache->maxSize; - settings->OffscreenCacheEntries = offscreen_cache->maxEntries; + offscreenCache->currentSurface = SCREEN_BITMAP_SURFACE; + offscreenCache->maxSize = 7680; + offscreenCache->maxEntries = 2000; - offscreen_cache->entries = (rdpBitmap**) malloc(sizeof(rdpBitmap*) * offscreen_cache->maxEntries); - ZeroMemory(offscreen_cache->entries, sizeof(rdpBitmap*) * offscreen_cache->maxEntries); + settings->OffscreenCacheSize = offscreenCache->maxSize; + settings->OffscreenCacheEntries = offscreenCache->maxEntries; + + offscreenCache->entries = (rdpBitmap**) malloc(sizeof(rdpBitmap*) * offscreenCache->maxEntries); + ZeroMemory(offscreenCache->entries, sizeof(rdpBitmap*) * offscreenCache->maxEntries); } - return offscreen_cache; + return offscreenCache; } -void offscreen_cache_free(rdpOffscreenCache* offscreen_cache) +void offscreen_cache_free(rdpOffscreenCache* offscreenCache) { int i; rdpBitmap* bitmap; - if (offscreen_cache != NULL) + if (offscreenCache) { - for (i = 0; i < (int) offscreen_cache->maxEntries; i++) + for (i = 0; i < (int) offscreenCache->maxEntries; i++) { - bitmap = offscreen_cache->entries[i]; + bitmap = offscreenCache->entries[i]; - if (bitmap != NULL) - Bitmap_Free(offscreen_cache->update->context, bitmap); + if (bitmap) + Bitmap_Free(offscreenCache->update->context, bitmap); } - free(offscreen_cache->entries); - free(offscreen_cache); + free(offscreenCache->entries); + free(offscreenCache); } } diff --git a/libfreerdp/cache/palette.c b/libfreerdp/cache/palette.c index 0d93b1ab8..a8561bb8d 100644 --- a/libfreerdp/cache/palette.c +++ b/libfreerdp/cache/palette.c @@ -27,30 +27,30 @@ #include -static void update_gdi_cache_color_table(rdpContext* context, - CACHE_COLOR_TABLE_ORDER* cache_color_table) +static void update_gdi_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cacheColorTable) { UINT32* colorTable; rdpCache* cache = context->cache; colorTable = (UINT32*) malloc(sizeof(UINT32) * 256); - CopyMemory(colorTable, cache_color_table->colorTable, sizeof(UINT32) * 256); + CopyMemory(colorTable, cacheColorTable->colorTable, sizeof(UINT32) * 256); - palette_cache_put(cache->palette, cache_color_table->cacheIndex, (void*) colorTable); + palette_cache_put(cache->palette, cacheColorTable->cacheIndex, (void*) colorTable); } -void* palette_cache_get(rdpPaletteCache* palette_cache, UINT32 index) +void* palette_cache_get(rdpPaletteCache* paletteCache, UINT32 index) { void* entry; - if (index >= palette_cache->maxEntries) + if (index >= paletteCache->maxEntries) { fprintf(stderr, "invalid color table index: 0x%04X\n", index); return NULL; } - entry = palette_cache->entries[index].entry; - if (entry == NULL) + entry = paletteCache->entries[index].entry; + + if (!entry) { fprintf(stderr, "invalid color table at index: 0x%04X\n", index); return NULL; @@ -59,20 +59,22 @@ void* palette_cache_get(rdpPaletteCache* palette_cache, UINT32 index) return entry; } -void palette_cache_put(rdpPaletteCache* palette_cache, UINT32 index, void* entry) +void palette_cache_put(rdpPaletteCache* paletteCache, UINT32 index, void* entry) { - if (index >= palette_cache->maxEntries) + if (index >= paletteCache->maxEntries) { fprintf(stderr, "invalid color table index: 0x%04X\n", index); + if (entry) free(entry); + return; } - if(NULL == palette_cache->entries[index].entry) - free(palette_cache->entries[index].entry); + if (paletteCache->entries[index].entry) + free(paletteCache->entries[index].entry); - palette_cache->entries[index].entry = entry; + paletteCache->entries[index].entry = entry; } void palette_cache_register_callbacks(rdpUpdate* update) @@ -82,34 +84,35 @@ void palette_cache_register_callbacks(rdpUpdate* update) rdpPaletteCache* palette_cache_new(rdpSettings* settings) { - rdpPaletteCache* palette_cache; + rdpPaletteCache* paletteCache; - palette_cache = (rdpPaletteCache*) malloc(sizeof(rdpPaletteCache)); - ZeroMemory(palette_cache, sizeof(rdpPaletteCache)); + paletteCache = (rdpPaletteCache*) malloc(sizeof(rdpPaletteCache)); + ZeroMemory(paletteCache, sizeof(rdpPaletteCache)); - if (palette_cache != NULL) + if (paletteCache) { - palette_cache->settings = settings; - palette_cache->maxEntries = 6; - palette_cache->entries = (PALETTE_TABLE_ENTRY*) malloc(sizeof(PALETTE_TABLE_ENTRY) * palette_cache->maxEntries); - ZeroMemory(palette_cache->entries, sizeof(PALETTE_TABLE_ENTRY) * palette_cache->maxEntries); + paletteCache->settings = settings; + paletteCache->maxEntries = 6; + paletteCache->entries = (PALETTE_TABLE_ENTRY*) malloc(sizeof(PALETTE_TABLE_ENTRY) * paletteCache->maxEntries); + ZeroMemory(paletteCache->entries, sizeof(PALETTE_TABLE_ENTRY) * paletteCache->maxEntries); } - return palette_cache; + return paletteCache; } -void palette_cache_free(rdpPaletteCache* palette_cache) +void palette_cache_free(rdpPaletteCache* paletteCache) { - if (palette_cache != NULL) + if (paletteCache) { int i; - for (i=0; imaxEntries; i++) + for (i = 0; i< paletteCache->maxEntries; i++) { - if (palette_cache->entries[i].entry) - free(palette_cache->entries[i].entry); + if (paletteCache->entries[i].entry) + free(paletteCache->entries[i].entry); } - free(palette_cache->entries); - free(palette_cache); + + free(paletteCache->entries); + free(paletteCache); } } From 13b6678977747a1fa3fd2f84aa75d94c02f98acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 3 Nov 2013 16:25:56 -0500 Subject: [PATCH 38/40] libfreerdp-core: start untangling session redirection --- include/freerdp/settings.h | 60 +++++++++--------- libfreerdp/common/settings.c | 45 ++++---------- libfreerdp/core/connection.c | 69 +++++---------------- libfreerdp/core/nego.c | 8 ++- libfreerdp/core/rdp.c | 42 ++++++++++++- libfreerdp/core/rdp.h | 1 + libfreerdp/core/redirection.c | 112 +++++++++++++++++++++++++++++++--- libfreerdp/core/redirection.h | 9 ++- libfreerdp/core/settings.c | 22 +++++-- libfreerdp/core/transport.c | 3 +- libfreerdp/core/transport.h | 2 +- 11 files changed, 233 insertions(+), 140 deletions(-) diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index b20cdde9a..153dcbdb1 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -568,22 +568,19 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; #define FreeRDP_PreconnectionBlob 1155 #define FreeRDP_SendPreconnectionPdu 1156 #define FreeRDP_RedirectionFlags 1216 -#define FreeRDP_LoadBalanceInfo 1217 -#define FreeRDP_LoadBalanceInfoLength 1218 -#define FreeRDP_RedirectionUsername 1219 -#define FreeRDP_RedirectionUsernameLength 1220 +#define FreeRDP_TargetNetAddress 1217 +#define FreeRDP_LoadBalanceInfo 1218 +#define FreeRDP_LoadBalanceInfoLength 1219 +#define FreeRDP_RedirectionUsername 1220 #define FreeRDP_RedirectionDomain 1221 -#define FreeRDP_RedirectionDomainLength 1222 -#define FreeRDP_RedirectionPassword 1223 -#define FreeRDP_RedirectionPasswordLength 1224 -#define FreeRDP_RedirectionTargetFQDN 1225 -#define FreeRDP_RedirectionTargetFQDNLength 1226 -#define FreeRDP_RedirectionTargetNetBiosName 1227 -#define FreeRDP_RedirectionTargetNetBiosNameLength 1228 -#define FreeRDP_RedirectionTsvUrl 1229 -#define FreeRDP_RedirectionTsvUrlLength 1230 -#define FreeRDP_TargetNetAddressCount 1231 -#define FreeRDP_TargetNetAddresses 1232 +#define FreeRDP_RedirectionPassword 1222 +#define FreeRDP_RedirectionPasswordLength 1223 +#define FreeRDP_RedirectionTargetFQDN 1224 +#define FreeRDP_RedirectionTargetNetBiosName 1225 +#define FreeRDP_RedirectionTsvUrl 1226 +#define FreeRDP_RedirectionTsvUrlLength 1227 +#define FreeRDP_TargetNetAddressCount 1228 +#define FreeRDP_TargetNetAddresses 1229 #define FreeRDP_Password51 1280 #define FreeRDP_Password51Length 1281 #define FreeRDP_KerberosKdc 1344 @@ -922,23 +919,20 @@ struct rdp_settings /* Server Redirection */ ALIGN64 UINT32 RedirectionFlags; /* 1216 */ - ALIGN64 BYTE* LoadBalanceInfo; /* 1217 */ - ALIGN64 UINT32 LoadBalanceInfoLength; /* 1218 */ - ALIGN64 BYTE* RedirectionUsername; /* 1219 */ - ALIGN64 UINT32 RedirectionUsernameLength; /* 1220 */ - ALIGN64 BYTE* RedirectionDomain; /* 1221 */ - ALIGN64 UINT32 RedirectionDomainLength; /* 1222 */ - ALIGN64 BYTE* RedirectionPassword; /* 1223 */ - ALIGN64 UINT32 RedirectionPasswordLength; /* 1224 */ - ALIGN64 BYTE* RedirectionTargetFQDN; /* 1225 */ - ALIGN64 UINT32 RedirectionTargetFQDNLength; /* 1226 */ - ALIGN64 BYTE* RedirectionTargetNetBiosName; /* 1227 */ - ALIGN64 UINT32 RedirectionTargetNetBiosNameLength; /* 1228 */ - ALIGN64 BYTE* RedirectionTsvUrl; /* 1229 */ - ALIGN64 UINT32 RedirectionTsvUrlLength; /* 1230 */ - ALIGN64 UINT32 TargetNetAddressCount; /* 1231 */ - ALIGN64 TARGET_NET_ADDRESS* TargetNetAddresses; /* 1232 */ - UINT64 padding1280[1280 - 1233]; /* 1233 */ + ALIGN64 char* TargetNetAddress; /* 1217 */ + ALIGN64 BYTE* LoadBalanceInfo; /* 1218 */ + ALIGN64 UINT32 LoadBalanceInfoLength; /* 1219 */ + ALIGN64 char* RedirectionUsername; /* 1220 */ + ALIGN64 char* RedirectionDomain; /* 1221 */ + ALIGN64 BYTE* RedirectionPassword; /* 1222 */ + ALIGN64 UINT32 RedirectionPasswordLength; /* 1223 */ + ALIGN64 char* RedirectionTargetFQDN; /* 1224 */ + ALIGN64 char* RedirectionTargetNetBiosName; /* 1225 */ + ALIGN64 BYTE* RedirectionTsvUrl; /* 1226 */ + ALIGN64 UINT32 RedirectionTsvUrlLength; /* 1227 */ + ALIGN64 UINT32 TargetNetAddressCount; /* 1228 */ + ALIGN64 char** TargetNetAddresses; /* 1229 */ + UINT64 padding1280[1280 - 1230]; /* 1230 */ /** * Security @@ -1331,6 +1325,8 @@ FREERDP_API ADDIN_ARGV* freerdp_dynamic_channel_collection_find(rdpSettings* set FREERDP_API ADDIN_ARGV* freerdp_dynamic_channel_clone(ADDIN_ARGV* channel); FREERDP_API void freerdp_dynamic_channel_collection_free(rdpSettings* settings); +FREERDP_API void freerdp_target_net_addresses_free(rdpSettings* settings); + FREERDP_API void freerdp_performance_flags_make(rdpSettings* settings); FREERDP_API void freerdp_performance_flags_split(rdpSettings* settings); diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index d0cc73f91..16fe998ba 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -402,6 +402,19 @@ void freerdp_dynamic_channel_collection_free(rdpSettings* settings) settings->DynamicChannelCount = 0; } +void freerdp_target_net_addresses_free(rdpSettings* settings) +{ + UINT32 index; + + for (index = 0; index < settings->TargetNetAddressCount; index++) + free(settings->TargetNetAddresses[index]); + + free(settings->TargetNetAddresses); + + settings->TargetNetAddressCount = 0; + settings->TargetNetAddresses = NULL; +} + void freerdp_performance_flags_make(rdpSettings* settings) { settings->PerformanceFlags = PERF_FLAG_NONE; @@ -1533,26 +1546,10 @@ UINT32 freerdp_get_param_uint32(rdpSettings* settings, int id) return settings->LoadBalanceInfoLength; break; - case FreeRDP_RedirectionUsernameLength: - return settings->RedirectionUsernameLength; - break; - - case FreeRDP_RedirectionDomainLength: - return settings->RedirectionDomainLength; - break; - case FreeRDP_RedirectionPasswordLength: return settings->RedirectionPasswordLength; break; - case FreeRDP_RedirectionTargetFQDNLength: - return settings->RedirectionTargetFQDNLength; - break; - - case FreeRDP_RedirectionTargetNetBiosNameLength: - return settings->RedirectionTargetNetBiosNameLength; - break; - case FreeRDP_RedirectionTsvUrlLength: return settings->RedirectionTsvUrlLength; break; @@ -1853,26 +1850,10 @@ int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param) settings->LoadBalanceInfoLength = param; break; - case FreeRDP_RedirectionUsernameLength: - settings->RedirectionUsernameLength = param; - break; - - case FreeRDP_RedirectionDomainLength: - settings->RedirectionDomainLength = param; - break; - case FreeRDP_RedirectionPasswordLength: settings->RedirectionPasswordLength = param; break; - case FreeRDP_RedirectionTargetFQDNLength: - settings->RedirectionTargetFQDNLength = param; - break; - - case FreeRDP_RedirectionTargetNetBiosNameLength: - settings->RedirectionTargetNetBiosNameLength = param; - break; - case FreeRDP_RedirectionTsvUrlLength: settings->RedirectionTsvUrlLength = param; break; diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 1f061c175..b980430de 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -292,82 +292,43 @@ BOOL rdp_client_redirect(rdpRdp* rdp) rdp_client_disconnect(rdp); - /* FIXME: this is a subset of rdp_free */ - /* --> this should really go into rdp.c */ - crypto_rc4_free(rdp->rc4_decrypt_key); - rdp->rc4_decrypt_key = NULL; - crypto_rc4_free(rdp->rc4_encrypt_key); - rdp->rc4_encrypt_key = NULL; - crypto_des3_free(rdp->fips_encrypt); - rdp->fips_encrypt = NULL; - crypto_des3_free(rdp->fips_decrypt); - rdp->fips_decrypt = NULL; - crypto_hmac_free(rdp->fips_hmac); - rdp->fips_hmac = NULL; + rdp_reset(rdp); - free(settings->ServerRandom); - settings->ServerRandom = NULL; - free(settings->ServerCertificate); - settings->ServerCertificate = NULL; - free(settings->ClientAddress); - settings->ClientAddress = NULL; + rdp_redirection_apply_settings(rdp); - mppc_enc_free(rdp->mppc_enc); - mppc_dec_free(rdp->mppc_dec); - mcs_free(rdp->mcs); - nego_free(rdp->nego); - license_free(rdp->license); - transport_free(rdp->transport); - - rdp->transport = transport_new(settings); - rdp->license = license_new(rdp); - rdp->nego = nego_new(rdp->transport); - rdp->mcs = mcs_new(rdp->transport); - rdp->mppc_dec = mppc_dec_new(); - rdp->mppc_enc = mppc_enc_new(PROTO_RDP_50); - - rdp->transport->layer = TRANSPORT_LAYER_TCP; - settings->RedirectedSessionId = redirection->sessionID; - - if (redirection->flags & LB_LOAD_BALANCE_INFO) + if (settings->RedirectionFlags & LB_LOAD_BALANCE_INFO) { - nego_set_routing_token(rdp->nego, redirection->LoadBalanceInfo, redirection->LoadBalanceInfoLength); + nego_set_routing_token(rdp->nego, settings->LoadBalanceInfo, settings->LoadBalanceInfoLength); } else { - if (redirection->flags & LB_TARGET_NET_ADDRESS) + if (settings->RedirectionFlags & LB_TARGET_NET_ADDRESS) { free(settings->ServerHostname); - settings->ServerHostname = _strdup(redirection->TargetNetAddress); + settings->ServerHostname = _strdup(settings->TargetNetAddress); } - else if (redirection->flags & LB_TARGET_FQDN) + else if (settings->RedirectionFlags & LB_TARGET_FQDN) { free(settings->ServerHostname); - settings->ServerHostname = _strdup(redirection->TargetFQDN); + settings->ServerHostname = _strdup(settings->RedirectionTargetFQDN); } - else if (redirection->flags & LB_TARGET_NETBIOS_NAME) + else if (settings->RedirectionFlags & LB_TARGET_NETBIOS_NAME) { free(settings->ServerHostname); - settings->ServerHostname = _strdup(redirection->TargetNetBiosName); + settings->ServerHostname = _strdup(settings->RedirectionTargetNetBiosName); } } - if (redirection->flags & LB_USERNAME) + if (settings->RedirectionFlags & LB_USERNAME) { free(settings->Username); - settings->Username = _strdup(redirection->Username); + settings->Username = _strdup(settings->RedirectionUsername); } - if (redirection->flags & LB_DOMAIN) + if (settings->RedirectionFlags & LB_DOMAIN) { free(settings->Domain); - settings->Domain = _strdup(redirection->Domain); - } - - if (redirection->flags & LB_PASSWORD) - { - settings->RedirectionPassword = redirection->PasswordCookie; - settings->RedirectionPasswordLength = redirection->PasswordCookieLength; + settings->Domain = _strdup(settings->RedirectionDomain); } status = rdp_client_connect(rdp); @@ -678,7 +639,7 @@ BOOL rdp_client_connect_demand_active(rdpRdp* rdp, wStream* s) * so that could result in a bad offset. */ - if (rdp_recv_out_of_sequence_pdu(rdp, s) != TRUE) + if (!rdp_recv_out_of_sequence_pdu(rdp, s)) return FALSE; return TRUE; diff --git a/libfreerdp/core/nego.c b/libfreerdp/core/nego.c index 9fb281f85..b2562b08e 100644 --- a/libfreerdp/core/nego.c +++ b/libfreerdp/core/nego.c @@ -968,9 +968,10 @@ rdpNego* nego_new(rdpTransport* transport) { rdpNego* nego = (rdpNego*) malloc(sizeof(rdpNego)); - if (nego != NULL) + if (nego) { ZeroMemory(nego, sizeof(rdpNego)); + nego->transport = transport; nego_init(nego); } @@ -985,6 +986,7 @@ rdpNego* nego_new(rdpTransport* transport) void nego_free(rdpNego* nego) { + free(nego->RoutingToken); free(nego->cookie); free(nego); } @@ -1071,8 +1073,10 @@ void nego_enable_ext(rdpNego* nego, BOOL enable_ext) void nego_set_routing_token(rdpNego* nego, BYTE* RoutingToken, DWORD RoutingTokenLength) { - nego->RoutingToken = RoutingToken; + free(nego->RoutingToken); nego->RoutingTokenLength = RoutingTokenLength; + nego->RoutingToken = (BYTE*) malloc(nego->RoutingTokenLength); + CopyMemory(nego->RoutingToken, RoutingToken, nego->RoutingTokenLength); } /** diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index ffdd312ba..d40bc5672 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -977,7 +977,7 @@ void rdp_set_blocking_mode(rdpRdp* rdp, BOOL blocking) int rdp_check_fds(rdpRdp* rdp) { int status; - status = transport_check_fds(&(rdp->transport)); + status = transport_check_fds(rdp->transport); return status; } @@ -1030,6 +1030,46 @@ rdpRdp* rdp_new(rdpContext* context) return rdp; } +void rdp_reset(rdpRdp* rdp) +{ + rdpSettings* settings; + + settings = rdp->settings; + + crypto_rc4_free(rdp->rc4_decrypt_key); + rdp->rc4_decrypt_key = NULL; + crypto_rc4_free(rdp->rc4_encrypt_key); + rdp->rc4_encrypt_key = NULL; + crypto_des3_free(rdp->fips_encrypt); + rdp->fips_encrypt = NULL; + crypto_des3_free(rdp->fips_decrypt); + rdp->fips_decrypt = NULL; + crypto_hmac_free(rdp->fips_hmac); + rdp->fips_hmac = NULL; + + mppc_enc_free(rdp->mppc_enc); + mppc_dec_free(rdp->mppc_dec); + mcs_free(rdp->mcs); + nego_free(rdp->nego); + license_free(rdp->license); + transport_free(rdp->transport); + + free(settings->ServerRandom); + settings->ServerRandom = NULL; + free(settings->ServerCertificate); + settings->ServerCertificate = NULL; + free(settings->ClientAddress); + settings->ClientAddress = NULL; + + rdp->transport = transport_new(rdp->settings); + rdp->license = license_new(rdp); + rdp->nego = nego_new(rdp->transport); + rdp->mcs = mcs_new(rdp->transport); + rdp->mppc_dec = mppc_dec_new(); + rdp->mppc_enc = mppc_enc_new(PROTO_RDP_50); + rdp->transport->layer = TRANSPORT_LAYER_TCP; +} + /** * Free RDP module. * @param rdp RDP module to be freed diff --git a/libfreerdp/core/rdp.h b/libfreerdp/core/rdp.h index c70d0c3d8..c5b9d1c86 100644 --- a/libfreerdp/core/rdp.h +++ b/libfreerdp/core/rdp.h @@ -197,6 +197,7 @@ void rdp_set_blocking_mode(rdpRdp* rdp, BOOL blocking); int rdp_check_fds(rdpRdp* rdp); rdpRdp* rdp_new(rdpContext* context); +void rdp_reset(rdpRdp* rdp); void rdp_free(rdpRdp* rdp); #ifdef WITH_DEBUG_RDP diff --git a/libfreerdp/core/redirection.c b/libfreerdp/core/redirection.c index f7adc808f..c1722d2e3 100644 --- a/libfreerdp/core/redirection.c +++ b/libfreerdp/core/redirection.c @@ -85,6 +85,89 @@ BOOL rdp_redirection_read_string(wStream* s, char** str) return TRUE; } +int rdp_redirection_apply_settings(rdpRdp* rdp) +{ + rdpSettings* settings = rdp->settings; + rdpRedirection* redirection = rdp->redirection; + + settings->RedirectionFlags = redirection->flags; + settings->RedirectedSessionId = redirection->sessionID; + + if (settings->RedirectionFlags & LB_LOAD_BALANCE_INFO) + { + /* LoadBalanceInfo may not contain a null terminator */ + free(settings->LoadBalanceInfo); + settings->LoadBalanceInfoLength = redirection->LoadBalanceInfoLength; + settings->LoadBalanceInfo = (BYTE*) malloc(settings->LoadBalanceInfoLength); + CopyMemory(settings->LoadBalanceInfo, redirection->LoadBalanceInfo, settings->LoadBalanceInfoLength); + } + else + { + if (settings->RedirectionFlags & LB_TARGET_NET_ADDRESS) + { + free(settings->TargetNetAddress); + settings->TargetNetAddress = _strdup(redirection->TargetNetAddress); + } + else if (settings->RedirectionFlags & LB_TARGET_FQDN) + { + free(settings->RedirectionTargetFQDN); + settings->RedirectionTargetFQDN = _strdup(redirection->TargetFQDN); + } + else if (settings->RedirectionFlags & LB_TARGET_NETBIOS_NAME) + { + free(settings->RedirectionTargetNetBiosName); + settings->RedirectionTargetNetBiosName = _strdup(redirection->TargetNetBiosName); + } + } + + if (settings->RedirectionFlags & LB_USERNAME) + { + free(settings->RedirectionUsername); + settings->RedirectionUsername = _strdup(redirection->Username); + } + + if (settings->RedirectionFlags & LB_DOMAIN) + { + free(settings->RedirectionDomain); + settings->RedirectionDomain = _strdup(redirection->Domain); + } + + if (settings->RedirectionFlags & LB_PASSWORD) + { + /* Password may be a cookie without a null terminator */ + free(settings->RedirectionPassword); + settings->RedirectionPasswordLength = redirection->PasswordLength; + settings->RedirectionPassword = (BYTE*) malloc(settings->RedirectionPasswordLength); + CopyMemory(settings->RedirectionPassword, redirection->Password, settings->RedirectionPasswordLength); + } + + if (settings->RedirectionFlags & LB_CLIENT_TSV_URL) + { + /* TsvUrl may not contain a null terminator */ + free(settings->RedirectionTsvUrl); + settings->RedirectionTsvUrlLength = redirection->TsvUrlLength; + settings->RedirectionTsvUrl = (BYTE*) malloc(settings->RedirectionTsvUrlLength); + CopyMemory(settings->RedirectionTsvUrl, redirection->TsvUrl, settings->RedirectionTsvUrlLength); + } + + if (settings->RedirectionFlags & LB_TARGET_NET_ADDRESSES) + { + int i; + + freerdp_target_net_addresses_free(settings); + + settings->TargetNetAddressCount = redirection->TargetNetAddressesCount; + settings->TargetNetAddresses = (char**) malloc(sizeof(char*) * settings->TargetNetAddressCount); + + for (i = 0; i < settings->TargetNetAddressCount; i++) + { + settings->TargetNetAddresses[i] = _strdup(redirection->TargetNetAddresses[i]); + } + } + + return 0; +} + BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) { UINT16 flags; @@ -152,13 +235,13 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) if (Stream_GetRemainingLength(s) < 4) return FALSE; - Stream_Read_UINT32(s, redirection->PasswordCookieLength); - redirection->PasswordCookie = (BYTE*) malloc(redirection->PasswordCookieLength); - Stream_Read(s, redirection->PasswordCookie, redirection->PasswordCookieLength); + Stream_Read_UINT32(s, redirection->PasswordLength); + redirection->Password = (BYTE*) malloc(redirection->PasswordLength); + Stream_Read(s, redirection->Password, redirection->PasswordLength); #ifdef WITH_DEBUG_REDIR - DEBUG_REDIR("password_cookie:"); - winpr_HexDump(redirection->PasswordCookie, redirection->PasswordCookieLength); + DEBUG_REDIR("PasswordCookie:"); + winpr_HexDump(redirection->Password, redirection->PasswordLength); #endif } @@ -180,10 +263,21 @@ BOOL rdp_recv_server_redirection_pdu(rdpRdp* rdp, wStream* s) if (redirection->flags & LB_CLIENT_TSV_URL) { - if (!rdp_redirection_read_string(s, &(redirection->TsvUrl))) + if (Stream_GetRemainingLength(s) < 4) return FALSE; - WLog_Print(redirection->log, WLOG_DEBUG, "TsvUrl: %s", redirection->TsvUrl); + Stream_Read_UINT32(s, redirection->TsvUrlLength); + + if (Stream_GetRemainingLength(s) < redirection->TsvUrlLength) + return FALSE; + + redirection->TsvUrl = (BYTE*) malloc(redirection->TsvUrlLength); + Stream_Read(s, redirection->TsvUrl, redirection->TsvUrlLength); + +#ifdef WITH_DEBUG_REDIR + DEBUG_REDIR("TsvUrl:"); + winpr_HexDump(redirection->TsvUrl, redirection->TsvUrlLength); +#endif } if (redirection->flags & LB_TARGET_NET_ADDRESSES) @@ -281,8 +375,8 @@ void redirection_free(rdpRedirection* redirection) if (redirection->LoadBalanceInfo) free(redirection->LoadBalanceInfo); - if (redirection->PasswordCookie) - free(redirection->PasswordCookie); + if (redirection->Password) + free(redirection->Password); if (redirection->TargetNetAddresses) { diff --git a/libfreerdp/core/redirection.h b/libfreerdp/core/redirection.h index b4f05e37f..d8f6a6584 100644 --- a/libfreerdp/core/redirection.h +++ b/libfreerdp/core/redirection.h @@ -35,11 +35,12 @@ struct rdp_redirection wLog* log; UINT32 flags; UINT32 sessionID; - char* TsvUrl; + BYTE* TsvUrl; + DWORD TsvUrlLength; char* Username; char* Domain; - BYTE* PasswordCookie; - DWORD PasswordCookieLength; + BYTE* Password; + DWORD PasswordLength; char* TargetFQDN; BYTE* LoadBalanceInfo; DWORD LoadBalanceInfoLength; @@ -52,6 +53,8 @@ struct rdp_redirection BOOL rdp_recv_redirection_packet(rdpRdp* rdp, wStream* s); BOOL rdp_recv_enhanced_security_redirection_packet(rdpRdp* rdp, wStream* s); +int rdp_redirection_apply_settings(rdpRdp* rdp); + rdpRedirection* redirection_new(void); void redirection_free(rdpRedirection* redirection); diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index b0a0e4e65..700b0f277 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -515,11 +515,7 @@ rdpSettings* freerdp_settings_clone(rdpSettings* settings) _settings->PreconnectionId = settings->PreconnectionId; /* 1154 */ _settings->RedirectionFlags = settings->RedirectionFlags; /* 1216 */ _settings->LoadBalanceInfoLength = settings->LoadBalanceInfoLength; /* 1218 */ - _settings->RedirectionUsernameLength = settings->RedirectionUsernameLength; /* 1220 */ - _settings->RedirectionDomainLength = settings->RedirectionDomainLength; /* 1222 */ _settings->RedirectionPasswordLength = settings->RedirectionPasswordLength; /* 1224 */ - _settings->RedirectionTargetFQDNLength = settings->RedirectionTargetFQDNLength; /* 1226 */ - _settings->RedirectionTargetNetBiosNameLength = settings->RedirectionTargetNetBiosNameLength; /* 1228 */ _settings->RedirectionTsvUrlLength = settings->RedirectionTsvUrlLength; /* 1230 */ _settings->TargetNetAddressCount = settings->TargetNetAddressCount; /* 1231 */ _settings->Password51Length = settings->Password51Length; /* 1281 */ @@ -725,6 +721,16 @@ rdpSettings* freerdp_settings_clone(rdpSettings* settings) _settings->ClientTimeZone = (TIME_ZONE_INFO*) malloc(sizeof(TIME_ZONE_INFO)); CopyMemory(_settings->ClientTimeZone, _settings->ClientTimeZone, sizeof(TIME_ZONE_INFO)); + _settings->TargetNetAddressCount = settings->TargetNetAddressCount; + + if (settings->TargetNetAddressCount > 0) + { + _settings->TargetNetAddresses = (char**) malloc(sizeof(char*) * settings->TargetNetAddressCount); + + for (index = 0; index < settings->TargetNetAddressCount; index++) + _settings->TargetNetAddresses[index] = _strdup(settings->TargetNetAddresses[index]); + } + _settings->DeviceCount = settings->DeviceCount; _settings->DeviceArraySize = settings->DeviceArraySize; _settings->DeviceArray = (RDPDR_DEVICE**) malloc(sizeof(RDPDR_DEVICE*) * _settings->DeviceArraySize); @@ -801,6 +807,14 @@ void freerdp_settings_free(rdpSettings* settings) free(settings->CurrentPath); free(settings->HomePath); free(settings->LoadBalanceInfo); + free(settings->TargetNetAddress); + free(settings->RedirectionTargetFQDN); + free(settings->RedirectionTargetNetBiosName); + free(settings->RedirectionUsername); + free(settings->RedirectionDomain); + free(settings->RedirectionPassword); + free(settings->RedirectionTsvUrl); + freerdp_target_net_addresses_free(settings); freerdp_device_collection_free(settings); freerdp_static_channel_collection_free(settings); freerdp_dynamic_channel_collection_free(settings); diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index f6fdf2d56..cac2080f1 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -796,14 +796,13 @@ void transport_get_read_handles(rdpTransport* transport, HANDLE* events, DWORD* } } -int transport_check_fds(rdpTransport** ptransport) +int transport_check_fds(rdpTransport* transport) { int pos; int status; UINT16 length; int recv_status; wStream* received; - rdpTransport* transport = *ptransport; if (!transport) return -1; diff --git a/libfreerdp/core/transport.h b/libfreerdp/core/transport.h index decc96dea..5d9e70302 100644 --- a/libfreerdp/core/transport.h +++ b/libfreerdp/core/transport.h @@ -94,7 +94,7 @@ BOOL transport_accept_nla(rdpTransport* transport); int transport_read(rdpTransport* transport, wStream* s); int transport_write(rdpTransport* transport, wStream* s); void transport_get_fds(rdpTransport* transport, void** rfds, int* rcount); -int transport_check_fds(rdpTransport** ptransport); +int transport_check_fds(rdpTransport* transport); BOOL transport_set_blocking_mode(rdpTransport* transport, BOOL blocking); void transport_get_read_handles(rdpTransport* transport, HANDLE* events, DWORD* count); From 5406ebd5d824c50fc26fd90d692c61483ad7eb8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 3 Nov 2013 19:10:33 -0500 Subject: [PATCH 39/40] channels/drive: refactoring --- channels/client/channels.c | 41 ++++--- channels/drive/client/drive_main.c | 168 ++++++++++++++------------- channels/rdpdr/client/rdpdr_main.c | 117 ++++++++++--------- channels/rdpsnd/client/rdpsnd_main.c | 11 +- libfreerdp/core/connection.c | 1 - 5 files changed, 184 insertions(+), 154 deletions(-) diff --git a/channels/client/channels.c b/channels/client/channels.c index 6ed24df5e..520073ce2 100644 --- a/channels/client/channels.c +++ b/channels/client/channels.c @@ -77,9 +77,9 @@ static wArrayList* g_ChannelsList = NULL; int g_open_handle_sequence = 1; /* For locking the global resources */ -static HANDLE g_mutex_init = NULL; +static CRITICAL_SECTION g_channels_lock; -rdpChannels* freerdp_channels_find_by_open_handle(int open_handle, int* pindex) +rdpChannels* freerdp_channels_find_by_open_handle(int OpenHandle, int* pindex) { int i, j; BOOL found = FALSE; @@ -94,7 +94,7 @@ rdpChannels* freerdp_channels_find_by_open_handle(int open_handle, int* pindex) { for (j = 0; j < channels->openDataCount; j++) { - if (channels->openDataList[j].OpenHandle == open_handle) + if (channels->openDataList[j].OpenHandle == OpenHandle) { *pindex = j; found = TRUE; @@ -324,11 +324,11 @@ UINT32 FreeRDP_VirtualChannelEventPush(UINT32 openHandle, wMessage* event) */ int freerdp_channels_global_init(void) { - if (!g_mutex_init) - g_mutex_init = CreateMutex(NULL, FALSE, NULL); - if (!g_ChannelsList) + { g_ChannelsList = ArrayList_New(TRUE); + InitializeCriticalSectionAndSpinCount(&g_channels_lock, 4000); + } return 0; } @@ -393,12 +393,12 @@ int freerdp_channels_client_load(rdpChannels* channels, rdpSettings* settings, v channels->can_call_init = TRUE; channels->settings = settings; - WaitForSingleObject(g_mutex_init, INFINITE); + EnterCriticalSection(&g_channels_lock); g_ChannelInitData.channels = channels; status = pChannelClientData->entry((PCHANNEL_ENTRY_POINTS) &ep); - ReleaseMutex(g_mutex_init); + LeaveCriticalSection(&g_channels_lock); /* disable MyVirtualChannelInit */ channels->settings = NULL; @@ -495,16 +495,15 @@ int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance) int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance) { int index; - char* hostname; - int hostnameLength; + char* name; + char* hostname; + int hostnameLength; CHANNEL_CLIENT_DATA* pChannelClientData; channels->is_connected = 1; hostname = instance->settings->ServerHostname; hostnameLength = strlen(hostname); - DEBUG_CHANNELS("hostname [%s] channels->num_libs [%d]", hostname, channels->clientDataCount); - for (index = 0; index < channels->clientDataCount; index++) { pChannelClientData = &channels->clientDataList[index]; @@ -518,10 +517,16 @@ int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance) pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle, CHANNEL_EVENT_CONNECTED, hostname, hostnameLength); + name = (char*) malloc(9); + CopyMemory(name, pChannelOpenData->name, 8); + name[8] = '\0'; + EventArgsInit(&e, "freerdp"); - e.name = pChannelOpenData->name; + e.name = name; e.pInterface = pChannelOpenData->pInterface; PubSub_OnChannelConnected(instance->context->pubSub, instance->context, &e); + + free(name); } } @@ -782,10 +787,12 @@ wMessage* freerdp_channels_pop_event(rdpChannels* channels) void freerdp_channels_close(rdpChannels* channels, freerdp* instance) { int index; + char* name; CHANNEL_OPEN_DATA* pChannelOpenData; CHANNEL_CLIENT_DATA* pChannelClientData; DEBUG_CHANNELS("closing"); + channels->is_connected = 0; freerdp_channels_check_fds(channels, instance); @@ -801,10 +808,16 @@ void freerdp_channels_close(rdpChannels* channels, freerdp* instance) pChannelOpenData = &channels->openDataList[index]; + name = (char*) malloc(9); + CopyMemory(name, pChannelOpenData->name, 8); + name[8] = '\0'; + EventArgsInit(&e, "freerdp"); - e.name = pChannelOpenData->name; + e.name = name; e.pInterface = pChannelOpenData->pInterface; PubSub_OnChannelDisconnected(instance->context->pubSub, instance->context, &e); + + free(name); } /* Emit a quit signal to the internal message pipe. */ diff --git a/channels/drive/client/drive_main.c b/channels/drive/client/drive_main.c index b350d5a27..311460621 100644 --- a/channels/drive/client/drive_main.c +++ b/channels/drive/client/drive_main.c @@ -96,17 +96,17 @@ static UINT32 drive_map_posix_err(int fs_errno) return rc; } -static DRIVE_FILE* drive_get_file_by_id(DRIVE_DEVICE* disk, UINT32 id) +static DRIVE_FILE* drive_get_file_by_id(DRIVE_DEVICE* drive, UINT32 id) { DRIVE_FILE* file = NULL; void* key = (void*) (size_t) id; - file = (DRIVE_FILE*) ListDictionary_GetItemValue(disk->files, key); + file = (DRIVE_FILE*) ListDictionary_GetItemValue(drive->files, key); return file; } -static void drive_process_irp_create(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_create(DRIVE_DEVICE* drive, IRP* irp) { int status; void* key; @@ -133,7 +133,7 @@ static void drive_process_irp_create(DRIVE_DEVICE* disk, IRP* irp) FileId = irp->devman->id_sequence++; - file = drive_file_new(disk->path, path, FileId, + file = drive_file_new(drive->path, path, FileId, DesiredAccess, CreateDisposition, CreateOptions); if (!file) @@ -154,7 +154,7 @@ static void drive_process_irp_create(DRIVE_DEVICE* disk, IRP* irp) else { key = (void*) (size_t) file->id; - ListDictionary_Add(disk->files, key, file); + ListDictionary_Add(drive->files, key, file); switch (CreateDisposition) { @@ -184,12 +184,12 @@ static void drive_process_irp_create(DRIVE_DEVICE* disk, IRP* irp) irp->Complete(irp); } -static void drive_process_irp_close(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_close(DRIVE_DEVICE* drive, IRP* irp) { void* key; DRIVE_FILE* file; - file = drive_get_file_by_id(disk, irp->FileId); + file = drive_get_file_by_id(drive, irp->FileId); key = (void*) (size_t) irp->FileId; @@ -199,7 +199,7 @@ static void drive_process_irp_close(DRIVE_DEVICE* disk, IRP* irp) } else { - ListDictionary_Remove(disk->files, key); + ListDictionary_Remove(drive->files, key); drive_file_free(file); } @@ -208,7 +208,7 @@ static void drive_process_irp_close(DRIVE_DEVICE* disk, IRP* irp) irp->Complete(irp); } -static void drive_process_irp_read(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_read(DRIVE_DEVICE* drive, IRP* irp) { DRIVE_FILE* file; UINT32 Length; @@ -218,7 +218,7 @@ static void drive_process_irp_read(DRIVE_DEVICE* disk, IRP* irp) Stream_Read_UINT32(irp->input, Length); Stream_Read_UINT64(irp->input, Offset); - file = drive_get_file_by_id(disk, irp->FileId); + file = drive_get_file_by_id(drive, irp->FileId); if (!file) { @@ -260,7 +260,7 @@ static void drive_process_irp_read(DRIVE_DEVICE* disk, IRP* irp) irp->Complete(irp); } -static void drive_process_irp_write(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_write(DRIVE_DEVICE* drive, IRP* irp) { DRIVE_FILE* file; UINT32 Length; @@ -270,7 +270,7 @@ static void drive_process_irp_write(DRIVE_DEVICE* disk, IRP* irp) Stream_Read_UINT64(irp->input, Offset); Stream_Seek(irp->input, 20); /* Padding */ - file = drive_get_file_by_id(disk, irp->FileId); + file = drive_get_file_by_id(drive, irp->FileId); if (!file) { @@ -298,14 +298,14 @@ static void drive_process_irp_write(DRIVE_DEVICE* disk, IRP* irp) irp->Complete(irp); } -static void drive_process_irp_query_information(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_query_information(DRIVE_DEVICE* drive, IRP* irp) { DRIVE_FILE* file; UINT32 FsInformationClass; Stream_Read_UINT32(irp->input, FsInformationClass); - file = drive_get_file_by_id(disk, irp->FileId); + file = drive_get_file_by_id(drive, irp->FileId); if (!file) { @@ -323,7 +323,7 @@ static void drive_process_irp_query_information(DRIVE_DEVICE* disk, IRP* irp) irp->Complete(irp); } -static void drive_process_irp_set_information(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_set_information(DRIVE_DEVICE* drive, IRP* irp) { DRIVE_FILE* file; UINT32 FsInformationClass; @@ -333,7 +333,7 @@ static void drive_process_irp_set_information(DRIVE_DEVICE* disk, IRP* irp) Stream_Read_UINT32(irp->input, Length); Stream_Seek(irp->input, 24); /* Padding */ - file = drive_get_file_by_id(disk, irp->FileId); + file = drive_get_file_by_id(drive, irp->FileId); if (!file) { @@ -353,7 +353,7 @@ static void drive_process_irp_set_information(DRIVE_DEVICE* disk, IRP* irp) irp->Complete(irp); } -static void drive_process_irp_query_volume_information(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_query_volume_information(DRIVE_DEVICE* drive, IRP* irp) { UINT32 FsInformationClass; wStream* output = irp->output; @@ -366,8 +366,8 @@ static void drive_process_irp_query_volume_information(DRIVE_DEVICE* disk, IRP* Stream_Read_UINT32(irp->input, FsInformationClass); - STATVFS(disk->path, &svfst); - STAT(disk->path, &st); + STATVFS(drive->path, &svfst); + STAT(drive->path, &st); switch (FsInformationClass) { @@ -448,7 +448,7 @@ static void drive_process_irp_query_volume_information(DRIVE_DEVICE* disk, IRP* /* http://msdn.microsoft.com/en-us/library/cc241518.aspx */ -static void drive_process_irp_silent_ignore(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_silent_ignore(DRIVE_DEVICE* drive, IRP* irp) { UINT32 FsInformationClass; wStream* output = irp->output; @@ -460,7 +460,7 @@ static void drive_process_irp_silent_ignore(DRIVE_DEVICE* disk, IRP* irp) irp->Complete(irp); } -static void drive_process_irp_query_directory(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_query_directory(DRIVE_DEVICE* drive, IRP* irp) { char* path = NULL; int status; @@ -480,7 +480,7 @@ static void drive_process_irp_query_directory(DRIVE_DEVICE* disk, IRP* irp) if (status < 1) path = (char*) calloc(1, 1); - file = drive_get_file_by_id(disk, irp->FileId); + file = drive_get_file_by_id(drive, irp->FileId); if (file == NULL) { @@ -497,12 +497,12 @@ static void drive_process_irp_query_directory(DRIVE_DEVICE* disk, IRP* irp) irp->Complete(irp); } -static void drive_process_irp_directory_control(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_directory_control(DRIVE_DEVICE* drive, IRP* irp) { switch (irp->MinorFunction) { case IRP_MN_QUERY_DIRECTORY: - drive_process_irp_query_directory(disk, irp); + drive_process_irp_query_directory(drive, irp); break; case IRP_MN_NOTIFY_CHANGE_DIRECTORY: /* TODO */ @@ -517,56 +517,56 @@ static void drive_process_irp_directory_control(DRIVE_DEVICE* disk, IRP* irp) } } -static void drive_process_irp_device_control(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp_device_control(DRIVE_DEVICE* drive, IRP* irp) { Stream_Write_UINT32(irp->output, 0); /* OutputBufferLength */ irp->Complete(irp); } -static void drive_process_irp(DRIVE_DEVICE* disk, IRP* irp) +static void drive_process_irp(DRIVE_DEVICE* drive, IRP* irp) { irp->IoStatus = STATUS_SUCCESS; switch (irp->MajorFunction) { case IRP_MJ_CREATE: - drive_process_irp_create(disk, irp); + drive_process_irp_create(drive, irp); break; case IRP_MJ_CLOSE: - drive_process_irp_close(disk, irp); + drive_process_irp_close(drive, irp); break; case IRP_MJ_READ: - drive_process_irp_read(disk, irp); + drive_process_irp_read(drive, irp); break; case IRP_MJ_WRITE: - drive_process_irp_write(disk, irp); + drive_process_irp_write(drive, irp); break; case IRP_MJ_QUERY_INFORMATION: - drive_process_irp_query_information(disk, irp); + drive_process_irp_query_information(drive, irp); break; case IRP_MJ_SET_INFORMATION: - drive_process_irp_set_information(disk, irp); + drive_process_irp_set_information(drive, irp); break; case IRP_MJ_QUERY_VOLUME_INFORMATION: - drive_process_irp_query_volume_information(disk, irp); + drive_process_irp_query_volume_information(drive, irp); break; case IRP_MJ_LOCK_CONTROL: - drive_process_irp_silent_ignore(disk, irp); + drive_process_irp_silent_ignore(drive, irp); break; case IRP_MJ_DIRECTORY_CONTROL: - drive_process_irp_directory_control(disk, irp); + drive_process_irp_directory_control(drive, irp); break; case IRP_MJ_DEVICE_CONTROL: - drive_process_irp_device_control(disk, irp); + drive_process_irp_device_control(drive, irp); break; default: @@ -576,77 +576,87 @@ static void drive_process_irp(DRIVE_DEVICE* disk, IRP* irp) } } -static void drive_process_irp_list(DRIVE_DEVICE* disk) +static void drive_process_irp_list(DRIVE_DEVICE* drive) { IRP* irp; while (1) { - if (WaitForSingleObject(disk->stopEvent, 0) == WAIT_OBJECT_0) + if (WaitForSingleObject(drive->stopEvent, 0) == WAIT_OBJECT_0) break; - irp = (IRP*) InterlockedPopEntrySList(disk->pIrpList); + irp = (IRP*) InterlockedPopEntrySList(drive->pIrpList); if (irp == NULL) break; - drive_process_irp(disk, irp); + drive_process_irp(drive, irp); } } static void* drive_thread_func(void* arg) { - DRIVE_DEVICE* disk = (DRIVE_DEVICE*) arg; - HANDLE hdl[] = {disk->irpEvent, disk->stopEvent}; + DWORD status; + DWORD nCount; + HANDLE handles[8]; + DRIVE_DEVICE* drive = (DRIVE_DEVICE*) arg; + + nCount = 0; + handles[nCount++] = drive->stopEvent; + handles[nCount++] = drive->irpEvent; while (1) { - DWORD rc = WaitForMultipleObjects(2, hdl, FALSE, INFINITE); - if (rc == WAIT_OBJECT_0 + 1) + status = WaitForMultipleObjects(nCount, handles, FALSE, INFINITE); + + if (WaitForSingleObject(drive->stopEvent, 0) == WAIT_OBJECT_0) + { break; + } - ResetEvent(disk->irpEvent); - drive_process_irp_list(disk); + ResetEvent(drive->irpEvent); + drive_process_irp_list(drive); } - ExitThread(0); + ExitThread(0); return NULL; } static void drive_irp_request(DEVICE* device, IRP* irp) { - DRIVE_DEVICE* disk = (DRIVE_DEVICE*) device; + DRIVE_DEVICE* drive = (DRIVE_DEVICE*) device; - InterlockedPushEntrySList(disk->pIrpList, &(irp->ItemEntry)); + InterlockedPushEntrySList(drive->pIrpList, &(irp->ItemEntry)); - SetEvent(disk->irpEvent); + SetEvent(drive->irpEvent); } static void drive_free(DEVICE* device) { IRP* irp; - DRIVE_DEVICE* disk = (DRIVE_DEVICE*) device; + DRIVE_DEVICE* drive = (DRIVE_DEVICE*) device; - SetEvent(disk->stopEvent); - WaitForSingleObject(disk->thread, INFINITE); - CloseHandle(disk->thread); - CloseHandle(disk->irpEvent); - CloseHandle(disk->stopEvent); + SetEvent(drive->stopEvent); + WaitForSingleObject(drive->thread, INFINITE); - while ((irp = (IRP*) InterlockedPopEntrySList(disk->pIrpList)) != NULL) + CloseHandle(drive->thread); + CloseHandle(drive->irpEvent); + CloseHandle(drive->stopEvent); + + while ((irp = (IRP*) InterlockedPopEntrySList(drive->pIrpList)) != NULL) irp->Discard(irp); - _aligned_free(disk->pIrpList); + _aligned_free(drive->pIrpList); - ListDictionary_Free(disk->files); + ListDictionary_Free(drive->files); - free(disk); + free(drive); } void drive_register_drive_path(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, char* name, char* path) { int i, length; - DRIVE_DEVICE* disk; + DRIVE_DEVICE* drive; #ifdef WIN32 /* @@ -664,35 +674,35 @@ void drive_register_drive_path(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, char* if (name[0] && path[0]) { - disk = (DRIVE_DEVICE*) malloc(sizeof(DRIVE_DEVICE)); - ZeroMemory(disk, sizeof(DRIVE_DEVICE)); + drive = (DRIVE_DEVICE*) malloc(sizeof(DRIVE_DEVICE)); + ZeroMemory(drive, sizeof(DRIVE_DEVICE)); - disk->device.type = RDPDR_DTYP_FILESYSTEM; - disk->device.name = name; - disk->device.IRPRequest = drive_irp_request; - disk->device.Free = drive_free; + drive->device.type = RDPDR_DTYP_FILESYSTEM; + drive->device.name = name; + drive->device.IRPRequest = drive_irp_request; + drive->device.Free = drive_free; length = strlen(name); - disk->device.data = Stream_New(NULL, length + 1); + drive->device.data = Stream_New(NULL, length + 1); for (i = 0; i <= length; i++) - Stream_Write_UINT8(disk->device.data, name[i] < 0 ? '_' : name[i]); + Stream_Write_UINT8(drive->device.data, name[i] < 0 ? '_' : name[i]); - disk->path = path; + drive->path = path; - disk->files = ListDictionary_New(TRUE); - ListDictionary_Object(disk->files)->fnObjectFree = (OBJECT_FREE_FN) drive_file_free; + drive->files = ListDictionary_New(TRUE); + ListDictionary_Object(drive->files)->fnObjectFree = (OBJECT_FREE_FN) drive_file_free; - disk->pIrpList = (PSLIST_HEADER) _aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT); - InitializeSListHead(disk->pIrpList); + drive->pIrpList = (PSLIST_HEADER) _aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT); + InitializeSListHead(drive->pIrpList); - disk->irpEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - disk->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - disk->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) drive_thread_func, disk, CREATE_SUSPENDED, NULL); + drive->irpEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + drive->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + drive->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) drive_thread_func, drive, CREATE_SUSPENDED, NULL); - pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) disk); + pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) drive); - ResumeThread(disk->thread); + ResumeThread(drive->thread); } } diff --git a/channels/rdpdr/client/rdpdr_main.c b/channels/rdpdr/client/rdpdr_main.c index f297b5d77..af21f5a26 100644 --- a/channels/rdpdr/client/rdpdr_main.c +++ b/channels/rdpdr/client/rdpdr_main.c @@ -204,6 +204,9 @@ static void rdpdr_send_device_list_announce_request(rdpdrPlugin* rdpdr, BOOL use } } + if (pKeys) + free(pKeys); + pos = Stream_GetPosition(s); Stream_SetPosition(s, count_pos); Stream_Write_UINT32(s, count); @@ -289,12 +292,6 @@ static void rdpdr_process_receive(rdpdrPlugin* rdpdr, wStream* s) Stream_Free(s, TRUE); } -static void rdpdr_process_terminate(rdpdrPlugin* rdpdr) -{ - devman_free(rdpdr->devman); - free(rdpdr); -} - /****************************************************************************************/ @@ -366,7 +363,7 @@ int rdpdr_send(rdpdrPlugin* rdpdr, wStream* s) return status; } -static void rdpdr_virtual_channel_event_data_received(rdpdrPlugin* plugin, +static void rdpdr_virtual_channel_event_data_received(rdpdrPlugin* rdpdr, void* pData, UINT32 dataLength, UINT32 totalLength, UINT32 dataFlags) { wStream* data_in; @@ -384,13 +381,13 @@ static void rdpdr_virtual_channel_event_data_received(rdpdrPlugin* plugin, if (dataFlags & CHANNEL_FLAG_FIRST) { - if (plugin->data_in != NULL) - Stream_Free(plugin->data_in, TRUE); + if (rdpdr->data_in != NULL) + Stream_Free(rdpdr->data_in, TRUE); - plugin->data_in = Stream_New(NULL, totalLength); + rdpdr->data_in = Stream_New(NULL, totalLength); } - data_in = plugin->data_in; + data_in = rdpdr->data_in; Stream_EnsureRemainingCapacity(data_in, (int) dataLength); Stream_Write(data_in, pData, dataLength); @@ -401,31 +398,31 @@ static void rdpdr_virtual_channel_event_data_received(rdpdrPlugin* plugin, fprintf(stderr, "svc_plugin_process_received: read error\n"); } - plugin->data_in = NULL; + rdpdr->data_in = NULL; Stream_SealLength(data_in); Stream_SetPosition(data_in, 0); - MessageQueue_Post(plugin->MsgPipe->In, NULL, 0, (void*) data_in, NULL); + MessageQueue_Post(rdpdr->MsgPipe->In, NULL, 0, (void*) data_in, NULL); } } static void rdpdr_virtual_channel_open_event(UINT32 openHandle, UINT32 event, void* pData, UINT32 dataLength, UINT32 totalLength, UINT32 dataFlags) { - rdpdrPlugin* plugin; + rdpdrPlugin* rdpdr; - plugin = (rdpdrPlugin*) rdpdr_get_open_handle_data(openHandle); + rdpdr = (rdpdrPlugin*) rdpdr_get_open_handle_data(openHandle); - if (!plugin) + if (!rdpdr) { - fprintf(stderr, "svc_plugin_open_event: error no match\n"); + fprintf(stderr, "rdpdr_virtual_channel_open_event: error no match\n"); return; } switch (event) { case CHANNEL_EVENT_DATA_RECEIVED: - rdpdr_virtual_channel_event_data_received(plugin, pData, dataLength, totalLength, dataFlags); + rdpdr_virtual_channel_event_data_received(rdpdr, pData, dataLength, totalLength, dataFlags); break; case CHANNEL_EVENT_WRITE_COMPLETE: @@ -441,16 +438,16 @@ static void* rdpdr_virtual_channel_client_thread(void* arg) { wStream* data; wMessage message; - rdpdrPlugin* plugin = (rdpdrPlugin*) arg; + rdpdrPlugin* rdpdr = (rdpdrPlugin*) arg; - rdpdr_process_connect(plugin); + rdpdr_process_connect(rdpdr); while (1) { - if (!MessageQueue_Wait(plugin->MsgPipe->In)) + if (!MessageQueue_Wait(rdpdr->MsgPipe->In)) break; - if (MessageQueue_Peek(plugin->MsgPipe->In, &message, TRUE)) + if (MessageQueue_Peek(rdpdr->MsgPipe->In, &message, TRUE)) { if (message.id == WMQ_QUIT) break; @@ -458,7 +455,7 @@ static void* rdpdr_virtual_channel_client_thread(void* arg) if (message.id == 0) { data = (wStream*) message.wParam; - rdpdr_process_receive(plugin, data); + rdpdr_process_receive(rdpdr, data); } } } @@ -467,72 +464,76 @@ static void* rdpdr_virtual_channel_client_thread(void* arg) return NULL; } -static void rdpdr_virtual_channel_event_connected(rdpdrPlugin* plugin, void* pData, UINT32 dataLength) +static void rdpdr_virtual_channel_event_connected(rdpdrPlugin* rdpdr, void* pData, UINT32 dataLength) { UINT32 status; - status = plugin->channelEntryPoints.pVirtualChannelOpen(plugin->InitHandle, - &plugin->OpenHandle, plugin->channelDef.name, rdpdr_virtual_channel_open_event); + status = rdpdr->channelEntryPoints.pVirtualChannelOpen(rdpdr->InitHandle, + &rdpdr->OpenHandle, rdpdr->channelDef.name, rdpdr_virtual_channel_open_event); - rdpdr_add_open_handle_data(plugin->OpenHandle, plugin); + rdpdr_add_open_handle_data(rdpdr->OpenHandle, rdpdr); if (status != CHANNEL_RC_OK) { - fprintf(stderr, "svc_plugin_process_connected: open failed: status: %d\n", status); + fprintf(stderr, "rdpdr_virtual_channel_event_connected: open failed: status: %d\n", status); return; } - plugin->MsgPipe = MessagePipe_New(); + rdpdr->MsgPipe = MessagePipe_New(); - plugin->thread = CreateThread(NULL, 0, - (LPTHREAD_START_ROUTINE) rdpdr_virtual_channel_client_thread, (void*) plugin, 0, NULL); + rdpdr->thread = CreateThread(NULL, 0, + (LPTHREAD_START_ROUTINE) rdpdr_virtual_channel_client_thread, (void*) rdpdr, 0, NULL); } -static void rdpdr_virtual_channel_event_terminated(rdpdrPlugin* plugin) +static void rdpdr_virtual_channel_event_terminated(rdpdrPlugin* rdpdr) { - MessagePipe_PostQuit(plugin->MsgPipe, 0); - WaitForSingleObject(plugin->thread, INFINITE); + MessagePipe_PostQuit(rdpdr->MsgPipe, 0); + WaitForSingleObject(rdpdr->thread, INFINITE); - MessagePipe_Free(plugin->MsgPipe); - CloseHandle(plugin->thread); + MessagePipe_Free(rdpdr->MsgPipe); + CloseHandle(rdpdr->thread); - plugin->channelEntryPoints.pVirtualChannelClose(plugin->OpenHandle); + rdpdr->channelEntryPoints.pVirtualChannelClose(rdpdr->OpenHandle); - if (plugin->data_in) + if (rdpdr->data_in) { - Stream_Free(plugin->data_in, TRUE); - plugin->data_in = NULL; + Stream_Free(rdpdr->data_in, TRUE); + rdpdr->data_in = NULL; } - rdpdr_process_terminate(plugin); + if (rdpdr->devman) + { + devman_free(rdpdr->devman); + rdpdr->devman = NULL; + } - rdpdr_remove_open_handle_data(plugin->OpenHandle); - rdpdr_remove_init_handle_data(plugin->InitHandle); + rdpdr_remove_open_handle_data(rdpdr->OpenHandle); + rdpdr_remove_init_handle_data(rdpdr->InitHandle); } static void rdpdr_virtual_channel_init_event(void* pInitHandle, UINT32 event, void* pData, UINT32 dataLength) { - rdpdrPlugin* plugin; + rdpdrPlugin* rdpdr; - plugin = (rdpdrPlugin*) rdpdr_get_init_handle_data(pInitHandle); + rdpdr = (rdpdrPlugin*) rdpdr_get_init_handle_data(pInitHandle); - if (!plugin) + if (!rdpdr) { - fprintf(stderr, "svc_plugin_init_event: error no match\n"); + fprintf(stderr, "rdpdr_virtual_channel_init_event: error no match\n"); return; } switch (event) { case CHANNEL_EVENT_CONNECTED: - rdpdr_virtual_channel_event_connected(plugin, pData, dataLength); + rdpdr_virtual_channel_event_connected(rdpdr, pData, dataLength); break; case CHANNEL_EVENT_DISCONNECTED: break; case CHANNEL_EVENT_TERMINATED: - rdpdr_virtual_channel_event_terminated(plugin); + rdpdr_virtual_channel_event_terminated(rdpdr); break; } } @@ -542,24 +543,24 @@ static void rdpdr_virtual_channel_init_event(void* pInitHandle, UINT32 event, vo int VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) { - rdpdrPlugin* plugin; + rdpdrPlugin* rdpdr; - plugin = (rdpdrPlugin*) malloc(sizeof(rdpdrPlugin)); - ZeroMemory(plugin, sizeof(rdpdrPlugin)); + rdpdr = (rdpdrPlugin*) malloc(sizeof(rdpdrPlugin)); + ZeroMemory(rdpdr, sizeof(rdpdrPlugin)); - plugin->channelDef.options = + rdpdr->channelDef.options = CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP | CHANNEL_OPTION_COMPRESS_RDP; - strcpy(plugin->channelDef.name, "rdpdr"); + strcpy(rdpdr->channelDef.name, "rdpdr"); - CopyMemory(&(plugin->channelEntryPoints), pEntryPoints, pEntryPoints->cbSize); + CopyMemory(&(rdpdr->channelEntryPoints), pEntryPoints, pEntryPoints->cbSize); - plugin->channelEntryPoints.pVirtualChannelInit(&plugin->InitHandle, - &plugin->channelDef, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, rdpdr_virtual_channel_init_event); + rdpdr->channelEntryPoints.pVirtualChannelInit(&rdpdr->InitHandle, + &rdpdr->channelDef, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, rdpdr_virtual_channel_init_event); - rdpdr_add_init_handle_data(plugin->InitHandle, (void*) plugin); + rdpdr_add_init_handle_data(rdpdr->InitHandle, (void*) rdpdr); return 1; } diff --git a/channels/rdpsnd/client/rdpsnd_main.c b/channels/rdpsnd/client/rdpsnd_main.c index 46d9e71c8..4706cf99f 100644 --- a/channels/rdpsnd/client/rdpsnd_main.c +++ b/channels/rdpsnd/client/rdpsnd_main.c @@ -297,8 +297,15 @@ void rdpsnd_recv_server_audio_formats_pdu(rdpsndPlugin* rdpsnd, wStream* s) Stream_Read_UINT16(s, format->wBitsPerSample); /* wBitsPerSample */ Stream_Read_UINT16(s, format->cbSize); /* cbSize */ - format->data = (BYTE*) malloc(format->cbSize); - Stream_Read(s, format->data, format->cbSize); + if (format->cbSize > 0) + { + format->data = (BYTE*) malloc(format->cbSize); + Stream_Read(s, format->data, format->cbSize); + } + else + { + format->data = NULL; + } } rdpsnd_select_supported_audio_formats(rdpsnd); diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index b980430de..7cdf86be4 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -288,7 +288,6 @@ BOOL rdp_client_redirect(rdpRdp* rdp) { BOOL status; rdpSettings* settings = rdp->settings; - rdpRedirection* redirection = rdp->redirection; rdp_client_disconnect(rdp); From 9b394a0189f4c0b007c164c7e40e34a46960dbc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 3 Nov 2013 21:01:36 -0500 Subject: [PATCH 40/40] channels/rdpdr: make use of MessageQueue for drive redirection --- channels/drive/client/drive_main.c | 80 ++++++---------------- channels/smartcard/client/smartcard_main.c | 6 +- 2 files changed, 24 insertions(+), 62 deletions(-) diff --git a/channels/drive/client/drive_main.c b/channels/drive/client/drive_main.c index 311460621..e61e23b7f 100644 --- a/channels/drive/client/drive_main.c +++ b/channels/drive/client/drive_main.c @@ -56,9 +56,7 @@ struct _DRIVE_DEVICE wListDictionary* files; HANDLE thread; - HANDLE irpEvent; - HANDLE stopEvent; - PSLIST_HEADER pIrpList; + wMessageQueue* IrpQueue; DEVMAN* devman; }; @@ -576,77 +574,47 @@ static void drive_process_irp(DRIVE_DEVICE* drive, IRP* irp) } } -static void drive_process_irp_list(DRIVE_DEVICE* drive) -{ - IRP* irp; - - while (1) - { - if (WaitForSingleObject(drive->stopEvent, 0) == WAIT_OBJECT_0) - break; - - irp = (IRP*) InterlockedPopEntrySList(drive->pIrpList); - - if (irp == NULL) - break; - - drive_process_irp(drive, irp); - } -} - static void* drive_thread_func(void* arg) { - DWORD status; - DWORD nCount; - HANDLE handles[8]; - DRIVE_DEVICE* drive = (DRIVE_DEVICE*) arg; + IRP* irp; + wMessage message; + DRIVE_DEVICE* drive = (DRIVE_DEVICE*) arg; - nCount = 0; - handles[nCount++] = drive->stopEvent; - handles[nCount++] = drive->irpEvent; + while (1) + { + if (!MessageQueue_Wait(drive->IrpQueue)) + break; - while (1) - { - status = WaitForMultipleObjects(nCount, handles, FALSE, INFINITE); + if (!MessageQueue_Peek(drive->IrpQueue, &message, TRUE)) + break; - if (WaitForSingleObject(drive->stopEvent, 0) == WAIT_OBJECT_0) - { - break; - } + if (message.id == WMQ_QUIT) + break; - ResetEvent(drive->irpEvent); - drive_process_irp_list(drive); - } + irp = (IRP*) message.wParam; - ExitThread(0); - return NULL; + if (irp) + drive_process_irp(drive, irp); + } + + ExitThread(0); + return NULL; } static void drive_irp_request(DEVICE* device, IRP* irp) { DRIVE_DEVICE* drive = (DRIVE_DEVICE*) device; - - InterlockedPushEntrySList(drive->pIrpList, &(irp->ItemEntry)); - - SetEvent(drive->irpEvent); + MessageQueue_Post(drive->IrpQueue, NULL, 0, (void*) irp, NULL); } static void drive_free(DEVICE* device) { - IRP* irp; DRIVE_DEVICE* drive = (DRIVE_DEVICE*) device; - SetEvent(drive->stopEvent); + MessageQueue_PostQuit(drive->IrpQueue, 0); WaitForSingleObject(drive->thread, INFINITE); CloseHandle(drive->thread); - CloseHandle(drive->irpEvent); - CloseHandle(drive->stopEvent); - - while ((irp = (IRP*) InterlockedPopEntrySList(drive->pIrpList)) != NULL) - irp->Discard(irp); - - _aligned_free(drive->pIrpList); ListDictionary_Free(drive->files); @@ -693,11 +661,7 @@ void drive_register_drive_path(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, char* drive->files = ListDictionary_New(TRUE); ListDictionary_Object(drive->files)->fnObjectFree = (OBJECT_FREE_FN) drive_file_free; - drive->pIrpList = (PSLIST_HEADER) _aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT); - InitializeSListHead(drive->pIrpList); - - drive->irpEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - drive->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + drive->IrpQueue = MessageQueue_New(); drive->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) drive_thread_func, drive, CREATE_SUSPENDED, NULL); pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) drive); diff --git a/channels/smartcard/client/smartcard_main.c b/channels/smartcard/client/smartcard_main.c index eccf6bfcc..1116dd1f0 100644 --- a/channels/smartcard/client/smartcard_main.c +++ b/channels/smartcard/client/smartcard_main.c @@ -31,7 +31,6 @@ #include #include -#include #include @@ -229,7 +228,7 @@ static void smartcard_irp_complete(IRP* irp) * to be in this file so that "smartcard_irp_request()" can reference it. */ - DEBUG_SVC("DeviceId %d FileId %d CompletionId %d", irp->device->id, irp->FileId, irp->CompletionId); + DEBUG_SCARD("DeviceId %d FileId %d CompletionId %d", irp->device->id, irp->FileId, irp->CompletionId); pos = Stream_GetPosition(irp->output); Stream_SetPosition(irp->output, 12); @@ -246,8 +245,7 @@ static void smartcard_irp_complete(IRP* irp) if (!duplicate) { - svc_plugin_send(irp->devman->plugin, irp->output); - irp->output = NULL; + irp->Complete(irp); } /* End TS Client defect workaround. */