libfreerdp-core: move blocking-send checking in transport.
This commit is contained in:
parent
a4ec778f02
commit
f33fe89a9d
@ -164,28 +164,18 @@ int tcp_read(rdpTcp* tcp, uint8* data, int length)
|
||||
int tcp_write(rdpTcp* tcp, uint8* data, int length)
|
||||
{
|
||||
int status;
|
||||
int sent = 0;
|
||||
|
||||
while (sent < length)
|
||||
status = send(tcp->sockfd, data, length, MSG_NOSIGNAL);
|
||||
|
||||
if (status < 0)
|
||||
{
|
||||
status = send(tcp->sockfd, data, (length - sent), MSG_NOSIGNAL);
|
||||
|
||||
if (status < 0)
|
||||
{
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
||||
continue;
|
||||
|
||||
perror("send");
|
||||
return -1;
|
||||
}
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
||||
status = 0;
|
||||
else
|
||||
{
|
||||
sent += status;
|
||||
data += status;
|
||||
}
|
||||
perror("send");
|
||||
}
|
||||
|
||||
return sent;
|
||||
return status;
|
||||
}
|
||||
|
||||
boolean tcp_disconnect(rdpTcp * tcp)
|
||||
|
@ -104,31 +104,24 @@ int tls_read(rdpTls* tls, uint8* data, int length)
|
||||
int tls_write(rdpTls* tls, uint8* data, int length)
|
||||
{
|
||||
int status;
|
||||
int sent = 0;
|
||||
|
||||
while (sent < length)
|
||||
status = SSL_write(tls->ssl, data, length);
|
||||
|
||||
switch (SSL_get_error(tls->ssl, status))
|
||||
{
|
||||
status = SSL_write(tls->ssl, data, length);
|
||||
case SSL_ERROR_NONE:
|
||||
break;
|
||||
|
||||
switch (SSL_get_error(tls->ssl, status))
|
||||
{
|
||||
case SSL_ERROR_NONE:
|
||||
sent += status;
|
||||
data += status;
|
||||
break;
|
||||
case SSL_ERROR_WANT_WRITE:
|
||||
status = 0;
|
||||
break;
|
||||
|
||||
case SSL_ERROR_WANT_WRITE:
|
||||
nanosleep(&tls->ts, NULL);
|
||||
break;
|
||||
|
||||
default:
|
||||
tls_print_error("SSL_write", tls->ssl, status);
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
tls_print_error("SSL_write", tls->ssl, status);
|
||||
status = -1;
|
||||
}
|
||||
|
||||
return sent;
|
||||
return status;
|
||||
}
|
||||
|
||||
boolean tls_print_error(char *func, SSL *connection, int value)
|
||||
@ -214,10 +207,6 @@ rdpTls* tls_new()
|
||||
*/
|
||||
|
||||
SSL_CTX_set_options(tls->ctx, SSL_OP_ALL);
|
||||
|
||||
/* a small 0.1ms delay when network blocking happens. */
|
||||
tls->ts.tv_sec = 0;
|
||||
tls->ts.tv_nsec = 100000;
|
||||
}
|
||||
|
||||
return tls;
|
||||
|
@ -153,11 +153,31 @@ static int transport_read_nonblocking(rdpTransport* transport)
|
||||
int transport_write(rdpTransport* transport, STREAM* s)
|
||||
{
|
||||
int status = -1;
|
||||
int length;
|
||||
int sent = 0;
|
||||
|
||||
if (transport->layer == TRANSPORT_LAYER_TLS)
|
||||
status = tls_write(transport->tls, s->data, stream_get_length(s));
|
||||
else if (transport->layer == TRANSPORT_LAYER_TCP)
|
||||
status = tcp_write(transport->tcp, s->data, stream_get_length(s));
|
||||
length = stream_get_length(s);
|
||||
stream_set_pos(s, 0);
|
||||
while (sent < length)
|
||||
{
|
||||
if (transport->layer == TRANSPORT_LAYER_TLS)
|
||||
status = tls_write(transport->tls, stream_get_tail(s), length);
|
||||
else if (transport->layer == TRANSPORT_LAYER_TCP)
|
||||
status = tcp_write(transport->tcp, stream_get_tail(s), length);
|
||||
|
||||
if (status < 0)
|
||||
break; /* error occurred */
|
||||
|
||||
if (status == 0)
|
||||
{
|
||||
/* blocking while sending */
|
||||
nanosleep(&transport->ts, NULL);
|
||||
continue;
|
||||
}
|
||||
|
||||
sent += status;
|
||||
stream_seek(s, status);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user