Using preloaded logger.

This commit is contained in:
Armin Novak 2017-02-22 09:42:56 +01:00
parent 1497b5654e
commit 363109c581
2 changed files with 66 additions and 65 deletions

View File

@ -63,7 +63,8 @@ static void* transport_client_thread(void* arg);
#include <krb5.h> #include <krb5.h>
#include <winpr/library.h> #include <winpr/library.h>
static UINT32 transport_krb5_check_account(char* username, char* domain, char* passwd) static UINT32 transport_krb5_check_account(rdpTransport* transport, char* username, char* domain,
char* passwd)
{ {
krb5_error_code ret; krb5_error_code ret;
krb5_context context; krb5_context context;
@ -75,14 +76,15 @@ static UINT32 transport_krb5_check_account(char* username, char* domain, char* p
/* Create a krb5 library context */ /* Create a krb5 library context */
if ((ret = krb5_init_context(&context)) != 0) if ((ret = krb5_init_context(&context)) != 0)
WLog_ERR(TAG, "krb5_init_context failed with error %d", (int)ret); WLog_Print(transport->log, WLOG_ERROR, "krb5_init_context failed with error %d", (int)ret);
else if ((ret = krb5_parse_name_flags(context, address, 0, &principal)) != 0) else if ((ret = krb5_parse_name_flags(context, address, 0, &principal)) != 0)
WLog_ERR(TAG, "krb5_parse_name_flags failed with error %d", (int)ret); WLog_Print(transport->log, WLOG_ERROR, "krb5_parse_name_flags failed with error %d", (int)ret);
/* Find a credential cache with a specified client principal */ /* Find a credential cache with a specified client principal */
else if ((ret = krb5_cc_cache_match(context, principal, &ccache)) != 0) else if ((ret = krb5_cc_cache_match(context, principal, &ccache)) != 0)
{ {
if ((ret = krb5_cc_default(context, &ccache)) != 0) if ((ret = krb5_cc_default(context, &ccache)) != 0)
WLog_ERR(TAG, "krb5 failed to resolve credentials cache with error %d", (int)ret); WLog_Print(transport->log, WLOG_ERROR, "krb5 failed to resolve credentials cache with error %d",
(int)ret);
} }
if (ret != KRB5KDC_ERR_NONE) if (ret != KRB5KDC_ERR_NONE)
@ -90,13 +92,13 @@ static UINT32 transport_krb5_check_account(char* username, char* domain, char* p
/* Create a context for acquiring initial credentials */ /* Create a context for acquiring initial credentials */
else if ((ret = krb5_init_creds_init(context, principal, NULL, NULL, 0, NULL, &ctx)) != 0) else if ((ret = krb5_init_creds_init(context, principal, NULL, NULL, 0, NULL, &ctx)) != 0)
{ {
WLog_WARN(TAG, "krb5_init_creds_init returned error %d", (int)ret); WLog_Print(transport->log, WLOG_WARN, "krb5_init_creds_init returned error %d", (int)ret);
goto out; goto out;
} }
/* Set a password for acquiring initial credentials */ /* Set a password for acquiring initial credentials */
else if ((ret = krb5_init_creds_set_password(context, ctx, passwd)) != 0) else if ((ret = krb5_init_creds_set_password(context, ctx, passwd)) != 0)
{ {
WLog_WARN(TAG, "krb5_init_creds_set_password returned error %d", ret); WLog_Print(transport->log, WLOG_WARN, "krb5_init_creds_set_password returned error %d", ret);
goto out; goto out;
} }
@ -114,12 +116,12 @@ out:
case KRB5KRB_AP_ERR_MODIFIED: case KRB5KRB_AP_ERR_MODIFIED:
case KRB5KDC_ERR_PREAUTH_FAILED: case KRB5KDC_ERR_PREAUTH_FAILED:
case KRB5_GET_IN_TKT_LOOP: case KRB5_GET_IN_TKT_LOOP:
WLog_WARN(TAG, "krb5_init_creds_get: Password incorrect"); WLog_Print(transport->log, WLOG_WARN, "krb5_init_creds_get: Password incorrect");
ret = FREERDP_ERROR_AUTHENTICATION_FAILED; ret = FREERDP_ERROR_AUTHENTICATION_FAILED;
break; break;
case KRB5KDC_ERR_KEY_EXP: case KRB5KDC_ERR_KEY_EXP:
WLog_WARN(TAG, "krb5_init_creds_get: Password has expired"); WLog_Print(transport->log, WLOG_WARN, "krb5_init_creds_get: Password has expired");
ret = FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED; ret = FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED;
break; break;
@ -132,7 +134,7 @@ out:
break; break;
default: default:
WLog_WARN(TAG, "krb5_init_creds_get"); WLog_Print(transport->log, WLOG_WARN, "krb5_init_creds_get");
ret = FREERDP_ERROR_CONNECT_TRANSPORT_FAILED; ret = FREERDP_ERROR_CONNECT_TRANSPORT_FAILED;
break; break;
} }
@ -147,16 +149,14 @@ out:
static void transport_ssl_cb(SSL* ssl, int where, int ret) static void transport_ssl_cb(SSL* ssl, int where, int ret)
{ {
rdpTransport* transport;
if (where | SSL_CB_ALERT) if (where | SSL_CB_ALERT)
{ {
rdpTransport* transport = (rdpTransport*) SSL_get_app_data(ssl);
switch (ret) switch (ret)
{ {
case SSL3_AL_FATAL | SSL_AD_ACCESS_DENIED: case SSL3_AL_FATAL | SSL_AD_ACCESS_DENIED:
{ {
transport = (rdpTransport*) SSL_get_app_data(ssl);
if (!freerdp_get_last_error(transport->context)) if (!freerdp_get_last_error(transport->context))
{ {
freerdp_set_last_error(transport->context, FREERDP_ERROR_AUTHENTICATION_FAILED); freerdp_set_last_error(transport->context, FREERDP_ERROR_AUTHENTICATION_FAILED);
@ -166,8 +166,6 @@ static void transport_ssl_cb(SSL* ssl, int where, int ret)
case SSL3_AL_FATAL | SSL_AD_INTERNAL_ERROR: case SSL3_AL_FATAL | SSL_AD_INTERNAL_ERROR:
{ {
transport = (rdpTransport*) SSL_get_app_data(ssl);
if (transport->NlaMode) if (transport->NlaMode)
{ {
UINT32 kret = 0; UINT32 kret = 0;
@ -176,7 +174,8 @@ static void transport_ssl_cb(SSL* ssl, int where, int ret)
if ((strlen(transport->settings->Domain) != 0) && if ((strlen(transport->settings->Domain) != 0) &&
(strncmp(transport->settings->Domain, ".", 1) != 0)) (strncmp(transport->settings->Domain, ".", 1) != 0))
{ {
kret = transport_krb5_check_account(transport->settings->Username, transport->settings->Domain, kret = transport_krb5_check_account(transport, transport->settings->Username,
transport->settings->Domain,
transport->settings->Password); transport->settings->Password);
} }
else else
@ -190,8 +189,8 @@ static void transport_ssl_cb(SSL* ssl, int where, int ret)
break; break;
default: default:
WLog_WARN(TAG, "Unhandled SSL error (where=%d, ret=%d [%s, %s])", where, ret, WLog_Print(transport->log, WLOG_WARN, "Unhandled SSL error (where=%d, ret=%d [%s, %s])", where, ret,
SSL_alert_type_string_long(ret), SSL_alert_desc_string_long(ret)); SSL_alert_type_string_long(ret), SSL_alert_desc_string_long(ret));
break; break;
} }
} }
@ -290,7 +289,7 @@ BOOL transport_connect_tls(rdpTransport* transport)
if (!transport->frontBio) if (!transport->frontBio)
{ {
WLog_ERR(TAG, "unable to prepend a filtering TLS bio"); WLog_Print(transport->log, WLOG_ERROR, "unable to prepend a filtering TLS bio");
return FALSE; return FALSE;
} }
@ -414,14 +413,14 @@ BOOL transport_connect(rdpTransport* transport, const char* hostname,
{ {
if (!(transport->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL))) if (!(transport->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
{ {
WLog_ERR(TAG, "Failed to create transport stop event"); WLog_Print(transport->log, WLOG_ERROR, "Failed to create transport stop event");
return FALSE; return FALSE;
} }
if (!(transport->thread = CreateThread(NULL, 0, if (!(transport->thread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) transport_client_thread, transport, 0, NULL))) (LPTHREAD_START_ROUTINE) transport_client_thread, transport, 0, NULL)))
{ {
WLog_ERR(TAG, "Failed to create transport client thread"); WLog_Print(transport->log, WLOG_ERROR, "Failed to create transport client thread");
CloseHandle(transport->stopEvent); CloseHandle(transport->stopEvent);
transport->stopEvent = NULL; transport->stopEvent = NULL;
return FALSE; return FALSE;
@ -482,7 +481,7 @@ BOOL transport_accept_nla(rdpTransport* transport)
if (nla_authenticate(transport->nla) < 0) if (nla_authenticate(transport->nla) < 0)
{ {
WLog_ERR(TAG, "client authentication failure"); WLog_Print(transport->log, WLOG_ERROR, "client authentication failure");
transport_set_nla_mode(transport, FALSE); transport_set_nla_mode(transport, FALSE);
nla_free(transport->nla); nla_free(transport->nla);
transport->nla = NULL; transport->nla = NULL;
@ -497,32 +496,26 @@ BOOL transport_accept_nla(rdpTransport* transport)
return TRUE; return TRUE;
} }
#define WLog_ERR_BIO(tag, biofunc, bio) \ #define WLog_ERR_BIO(transport, biofunc, bio) \
transport_bio_error_log(tag, biofunc, bio, __FILE__, __FUNCTION__, __LINE__) transport_bio_error_log(transport, biofunc, bio, __FILE__, __FUNCTION__, __LINE__)
static void transport_bio_error_log(LPCSTR tag, LPCSTR biofunc, BIO* bio, static void transport_bio_error_log(rdpTransport* transport, LPCSTR biofunc, BIO* bio,
LPCSTR file, LPCSTR func, DWORD line) LPCSTR file, LPCSTR func, DWORD line)
{ {
unsigned long sslerr; unsigned long sslerr;
char* buf; char* buf;
wLog* log;
int saveerrno; int saveerrno;
DWORD level; DWORD level;
saveerrno = errno; saveerrno = errno;
log = WLog_Get(tag);
if (!log)
return;
level = WLOG_ERROR; level = WLOG_ERROR;
if (level < WLog_GetLogLevel(log)) if (level < WLog_GetLogLevel(transport->log))
return; return;
if (ERR_peek_error() == 0) if (ERR_peek_error() == 0)
{ {
const char* fmt = "%s returned a system error %d: %s"; const char* fmt = "%s returned a system error %d: %s";
WLog_PrintMessage(log, WLOG_MESSAGE_TEXT, level, line, file, func, fmt, biofunc, WLog_PrintMessage(transport->log, WLOG_MESSAGE_TEXT, level, line, file, func, fmt, biofunc,
saveerrno, strerror(saveerrno)); saveerrno, strerror(saveerrno));
return; return;
} }
@ -536,7 +529,7 @@ static void transport_bio_error_log(LPCSTR tag, LPCSTR biofunc, BIO* bio,
while ((sslerr = ERR_get_error())) while ((sslerr = ERR_get_error()))
{ {
ERR_error_string_n(sslerr, buf, 120); ERR_error_string_n(sslerr, buf, 120);
WLog_PrintMessage(log, WLOG_MESSAGE_TEXT, level, line, file, func, fmt, biofunc, WLog_PrintMessage(transport->log, WLOG_MESSAGE_TEXT, level, line, file, func, fmt, biofunc,
buf); buf);
} }
@ -566,11 +559,11 @@ int transport_read_layer(rdpTransport* transport, BYTE* data, int bytes)
/* something unexpected happened, let's close */ /* something unexpected happened, let's close */
if (!transport->frontBio) if (!transport->frontBio)
{ {
WLog_ERR(TAG, "BIO_read: transport->frontBio null"); WLog_Print(transport->log, WLOG_ERROR, "BIO_read: transport->frontBio null");
return -1; return -1;
} }
WLog_ERR_BIO(TAG, "BIO_read", transport->frontBio); WLog_ERR_BIO(transport, "BIO_read", transport->frontBio);
transport->layer = TRANSPORT_LAYER_CLOSED; transport->layer = TRANSPORT_LAYER_CLOSED;
return -1; return -1;
} }
@ -582,7 +575,7 @@ int transport_read_layer(rdpTransport* transport, BYTE* data, int bytes)
/* blocking means that we can't continue until we have read the number of requested bytes */ /* blocking means that we can't continue until we have read the number of requested bytes */
if (BIO_wait_read(transport->frontBio, 100) < 0) if (BIO_wait_read(transport->frontBio, 100) < 0)
{ {
WLog_ERR_BIO(TAG, "BIO_wait_read", transport->frontBio); WLog_ERR_BIO(transport, "BIO_wait_read", transport->frontBio);
return -1; return -1;
} }
@ -706,7 +699,7 @@ int transport_read_pdu(rdpTransport* transport, wStream* s)
} }
else else
{ {
WLog_ERR(TAG, "Error reading TSRequest!"); WLog_Print(transport->log, WLOG_ERROR, "Error reading TSRequest!");
return -1; return -1;
} }
} }
@ -732,7 +725,7 @@ int transport_read_pdu(rdpTransport* transport, wStream* s)
/* min and max values according to ITU-T Rec. T.123 (01/2007) section 8 */ /* min and max values according to ITU-T Rec. T.123 (01/2007) section 8 */
if (pduLength < 7 || pduLength > 0xFFFF) if (pduLength < 7 || pduLength > 0xFFFF)
{ {
WLog_ERR(TAG, "tpkt - invalid pduLength: %d", pduLength); WLog_Print(transport->log, WLOG_ERROR, "tpkt - invalid pduLength: %d", pduLength);
return -1; return -1;
} }
} }
@ -758,7 +751,7 @@ int transport_read_pdu(rdpTransport* transport, wStream* s)
*/ */
if (pduLength < 3 || pduLength > 0x8000) if (pduLength < 3 || pduLength > 0x8000)
{ {
WLog_ERR(TAG, "fast path - invalid pduLength: %d", pduLength); WLog_Print(transport->log, WLOG_ERROR, "fast path - invalid pduLength: %d", pduLength);
return -1; return -1;
} }
} }
@ -774,7 +767,7 @@ int transport_read_pdu(rdpTransport* transport, wStream* s)
return status; return status;
if (Stream_GetPosition(s) >= pduLength) if (Stream_GetPosition(s) >= pduLength)
WLog_Packet(WLog_Get(TAG), WLOG_TRACE, Stream_Buffer(s), pduLength, WLog_Packet(transport->log, WLOG_TRACE, Stream_Buffer(s), pduLength,
WLOG_PACKET_INBOUND); WLOG_PACKET_INBOUND);
Stream_SealLength(s); Stream_SealLength(s);
@ -804,7 +797,7 @@ int transport_write(rdpTransport* transport, wStream* s)
if (length > 0) if (length > 0)
{ {
WLog_Packet(WLog_Get(TAG), WLOG_TRACE, Stream_Buffer(s), length, WLog_Packet(transport->log, WLOG_TRACE, Stream_Buffer(s), length,
WLOG_PACKET_OUTBOUND); WLOG_PACKET_OUTBOUND);
} }
@ -820,20 +813,20 @@ int transport_write(rdpTransport* transport, wStream* s)
*/ */
if (!BIO_should_retry(transport->frontBio)) if (!BIO_should_retry(transport->frontBio))
{ {
WLog_ERR_BIO(TAG, "BIO_should_retry", transport->frontBio); WLog_ERR_BIO(transport, "BIO_should_retry", transport->frontBio);
goto out_cleanup; goto out_cleanup;
} }
/* non-blocking can live with blocked IOs */ /* non-blocking can live with blocked IOs */
if (!transport->blocking) if (!transport->blocking)
{ {
WLog_ERR_BIO(TAG, "BIO_write", transport->frontBio); WLog_ERR_BIO(transport, "BIO_write", transport->frontBio);
goto out_cleanup; goto out_cleanup;
} }
if (BIO_wait_write(transport->frontBio, 100) < 0) if (BIO_wait_write(transport->frontBio, 100) < 0)
{ {
WLog_ERR_BIO(TAG, "BIO_wait_write", transport->frontBio); WLog_ERR_BIO(transport, "BIO_wait_write", transport->frontBio);
status = -1; status = -1;
goto out_cleanup; goto out_cleanup;
} }
@ -847,14 +840,14 @@ int transport_write(rdpTransport* transport, wStream* s)
{ {
if (BIO_wait_write(transport->frontBio, 100) < 0) if (BIO_wait_write(transport->frontBio, 100) < 0)
{ {
WLog_ERR(TAG, "error when selecting for write"); WLog_Print(transport->log, WLOG_ERROR, "error when selecting for write");
status = -1; status = -1;
goto out_cleanup; goto out_cleanup;
} }
if (BIO_flush(transport->frontBio) < 1) if (BIO_flush(transport->frontBio) < 1)
{ {
WLog_ERR(TAG, "error when flushing outputBuffer"); WLog_Print(transport->log, WLOG_ERROR, "error when flushing outputBuffer");
status = -1; status = -1;
goto out_cleanup; goto out_cleanup;
} }
@ -889,7 +882,7 @@ DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events,
{ {
if (count < 1) if (count < 1)
{ {
WLog_ERR(TAG, "%s: provided handles array is too small", __FUNCTION__); WLog_Print(transport->log, WLOG_ERROR, "%s: provided handles array is too small", __FUNCTION__);
return 0; return 0;
} }
@ -904,14 +897,15 @@ DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events,
{ {
if (nCount > count) if (nCount > count)
{ {
WLog_ERR(TAG, "%s: provided handles array is too small (count=%"PRIu32" nCount=%"PRIu32")", WLog_Print(transport->log, WLOG_ERROR,
__FUNCTION__, count, nCount); "%s: provided handles array is too small (count=%"PRIu32" nCount=%"PRIu32")",
__FUNCTION__, count, nCount);
return 0; return 0;
} }
if (BIO_get_event(transport->frontBio, &events[1]) != 1) if (BIO_get_event(transport->frontBio, &events[1]) != 1)
{ {
WLog_ERR(TAG, "%s: error getting the frontBio handle", __FUNCTION__); WLog_Print(transport->log, WLOG_ERROR, "%s: error getting the frontBio handle", __FUNCTION__);
return 0; return 0;
} }
} }
@ -1010,7 +1004,7 @@ int transport_check_fds(rdpTransport* transport)
if ((status = transport_read_pdu(transport, transport->ReceiveBuffer)) <= 0) if ((status = transport_read_pdu(transport, transport->ReceiveBuffer)) <= 0)
{ {
if (status < 0) if (status < 0)
WLog_DBG(TAG, "transport_check_fds: transport_read_pdu() - %i", status); WLog_Print(transport->log, WLOG_DEBUG, "transport_check_fds: transport_read_pdu() - %i", status);
return status; return status;
} }
@ -1038,8 +1032,8 @@ int transport_check_fds(rdpTransport* transport)
if (recv_status < 0) if (recv_status < 0)
{ {
WLog_ERR(TAG, "transport_check_fds: transport->ReceiveCallback() - %i", WLog_Print(transport->log, WLOG_ERROR, "transport_check_fds: transport->ReceiveCallback() - %i",
recv_status); recv_status);
return -1; return -1;
} }
@ -1138,7 +1132,7 @@ static void* transport_client_thread(void* arg)
rdpTransport* transport = (rdpTransport*) arg; rdpTransport* transport = (rdpTransport*) arg;
rdpContext* context = transport->context; rdpContext* context = transport->context;
rdpRdp* rdp = context->rdp; rdpRdp* rdp = context->rdp;
WLog_DBG(TAG, "Asynchronous transport thread started"); WLog_Print(transport->log, WLOG_DEBUG, "Asynchronous transport thread started");
nCount = 0; nCount = 0;
handles[nCount++] = transport->stopEvent; handles[nCount++] = transport->stopEvent;
handles[nCount++] = transport->connectedEvent; handles[nCount++] = transport->connectedEvent;
@ -1147,15 +1141,16 @@ static void* transport_client_thread(void* arg)
switch (status) switch (status)
{ {
case WAIT_OBJECT_0: case WAIT_OBJECT_0:
WLog_DBG(TAG, "stopEvent triggered"); WLog_Print(transport->log, WLOG_DEBUG, "stopEvent triggered");
goto out; goto out;
case WAIT_OBJECT_0 + 1: case WAIT_OBJECT_0 + 1:
WLog_DBG(TAG, "connectedEvent event triggered"); WLog_Print(transport->log, WLOG_DEBUG, "connectedEvent event triggered");
break; break;
default: default:
WLog_ERR(TAG, "WaitForMultipleObjects failed with status 0x%08"PRIX32"", status); WLog_Print(transport->log, WLOG_ERROR, "WaitForMultipleObjects failed with status 0x%08"PRIX32"",
status);
dwExitCode = 1; dwExitCode = 1;
goto out; goto out;
} }
@ -1167,7 +1162,7 @@ static void* transport_client_thread(void* arg)
if (!(nCountTmp = freerdp_get_event_handles(context, &handles[nCount], if (!(nCountTmp = freerdp_get_event_handles(context, &handles[nCount],
64 - nCount))) 64 - nCount)))
{ {
WLog_ERR(TAG, "freerdp_get_event_handles failed"); WLog_Print(transport->log, WLOG_ERROR, "freerdp_get_event_handles failed");
break; break;
} }
@ -1176,21 +1171,21 @@ static void* transport_client_thread(void* arg)
if (transport->layer == TRANSPORT_LAYER_CLOSED) if (transport->layer == TRANSPORT_LAYER_CLOSED)
{ {
WLog_DBG(TAG, "TRANSPORT_LAYER_CLOSED"); WLog_Print(transport->log, WLOG_DEBUG, "TRANSPORT_LAYER_CLOSED");
rdp_set_error_info(rdp, ERRINFO_PEER_DISCONNECTED); rdp_set_error_info(rdp, ERRINFO_PEER_DISCONNECTED);
break; break;
} }
if (status == WAIT_OBJECT_0) if (status == WAIT_OBJECT_0)
{ {
WLog_DBG(TAG, "stopEvent triggered"); WLog_Print(transport->log, WLOG_DEBUG, "stopEvent triggered");
break; break;
} }
else if (status > WAIT_OBJECT_0 && status < (WAIT_OBJECT_0 + nCount)) else if (status > WAIT_OBJECT_0 && status < (WAIT_OBJECT_0 + nCount))
{ {
if (!freerdp_check_event_handles(context)) if (!freerdp_check_event_handles(context))
{ {
WLog_ERR(TAG, "freerdp_check_event_handles()"); WLog_Print(transport->log, WLOG_ERROR, "freerdp_check_event_handles()");
rdp_set_error_info(rdp, ERRINFO_PEER_DISCONNECTED); rdp_set_error_info(rdp, ERRINFO_PEER_DISCONNECTED);
break; break;
} }
@ -1198,9 +1193,9 @@ static void* transport_client_thread(void* arg)
else else
{ {
if (status == WAIT_TIMEOUT) if (status == WAIT_TIMEOUT)
WLog_ERR(TAG, "WaitForMultipleObjects returned WAIT_TIMEOUT"); WLog_Print(transport->log, WLOG_ERROR, "WaitForMultipleObjects returned WAIT_TIMEOUT");
else else
WLog_ERR(TAG, "WaitForMultipleObjects returned 0x%08"PRIX32"", status); WLog_Print(transport->log, WLOG_ERROR, "WaitForMultipleObjects returned 0x%08"PRIX32"", status);
dwExitCode = 1; dwExitCode = 1;
break; break;
@ -1208,7 +1203,7 @@ static void* transport_client_thread(void* arg)
} }
out: out:
WLog_DBG(TAG, "Terminating transport thread"); WLog_Print(transport->log, WLOG_DEBUG, "Terminating transport thread");
ExitThread(dwExitCode); ExitThread(dwExitCode);
return NULL; return NULL;
} }
@ -1221,6 +1216,11 @@ rdpTransport* transport_new(rdpContext* context)
if (!transport) if (!transport)
return NULL; return NULL;
transport->log = WLog_Get(TAG);
if (!transport->log)
goto out_free_transport;
transport->context = context; transport->context = context;
transport->settings = context->settings; transport->settings = context->settings;
transport->ReceivePool = StreamPool_New(TRUE, BUFFER_SIZE); transport->ReceivePool = StreamPool_New(TRUE, BUFFER_SIZE);

View File

@ -81,6 +81,7 @@ struct rdp_transport
ULONG written; ULONG written;
HANDLE rereadEvent; HANDLE rereadEvent;
BOOL haveMoreBytesToRead; BOOL haveMoreBytesToRead;
wLog* log;
}; };
FREERDP_LOCAL wStream* transport_send_stream_init(rdpTransport* transport, FREERDP_LOCAL wStream* transport_send_stream_init(rdpTransport* transport,