diff --git a/include/freerdp/utils/tcp.h b/include/freerdp/utils/tcp.h index 75dee451e..28c8a3f46 100644 --- a/include/freerdp/utils/tcp.h +++ b/include/freerdp/utils/tcp.h @@ -29,4 +29,6 @@ FREERDP_API int freerdp_tcp_read(int sockfd, uint8* data, int length); FREERDP_API int freerdp_tcp_write(int sockfd, uint8* data, int length); FREERDP_API int freerdp_tcp_disconnect(int sockfd); +FREERDP_API int freerdp_tcp_set_no_delay(int sockfd, boolean no_delay); + #endif /* FREERDP_TCP_UTILS_H */ diff --git a/libfreerdp-core/listener.c b/libfreerdp-core/listener.c index ee3f98c93..2fb15a033 100644 --- a/libfreerdp-core/listener.c +++ b/libfreerdp-core/listener.c @@ -153,13 +153,13 @@ static boolean freerdp_listener_get_fds(freerdp_listener* instance, void** rfds, static boolean freerdp_listener_check_fds(freerdp_listener* instance) { - rdpListener* listener = (rdpListener*)instance->listener; - struct sockaddr_storage peer_addr; - socklen_t peer_addr_size; - int peer_sockfd; int i; - freerdp_peer* client; void* sin_addr; + int peer_sockfd; + freerdp_peer* client; + socklen_t peer_addr_size; + struct sockaddr_storage peer_addr; + rdpListener* listener = (rdpListener*) instance->listener; if (listener->num_sockfds < 1) return false; @@ -167,7 +167,7 @@ static boolean freerdp_listener_check_fds(freerdp_listener* instance) for (i = 0; i < listener->num_sockfds; i++) { peer_addr_size = sizeof(peer_addr); - peer_sockfd = accept(listener->sockfds[i], (struct sockaddr *)&peer_addr, &peer_addr_size); + peer_sockfd = accept(listener->sockfds[i], (struct sockaddr*) &peer_addr, &peer_addr_size); if (peer_sockfd == -1) { @@ -188,9 +188,10 @@ static boolean freerdp_listener_check_fds(freerdp_listener* instance) client = freerdp_peer_new(peer_sockfd); if (peer_addr.ss_family == AF_INET) - sin_addr = &(((struct sockaddr_in*)&peer_addr)->sin_addr); + sin_addr = &(((struct sockaddr_in*) &peer_addr)->sin_addr); else - sin_addr = &(((struct sockaddr_in6*)&peer_addr)->sin6_addr); + sin_addr = &(((struct sockaddr_in6*) &peer_addr)->sin6_addr); + inet_ntop(peer_addr.ss_family, sin_addr, client->hostname, sizeof(client->hostname)); IFCALL(instance->PeerAccepted, instance, client); @@ -213,7 +214,7 @@ freerdp_listener* freerdp_listener_new(void) listener = xnew(rdpListener); listener->instance = instance; - instance->listener = (void*)listener; + instance->listener = (void*) listener; return instance; } @@ -222,7 +223,7 @@ void freerdp_listener_free(freerdp_listener* instance) { rdpListener* listener; - listener = (rdpListener*)instance->listener; + listener = (rdpListener*) instance->listener; xfree(listener); xfree(instance); diff --git a/libfreerdp-core/peer.c b/libfreerdp-core/peer.c index 0c30f45ce..856e5522a 100644 --- a/libfreerdp-core/peer.c +++ b/libfreerdp-core/peer.c @@ -18,6 +18,7 @@ */ #include "certificate.h" +#include #include "peer.h" @@ -25,7 +26,9 @@ static boolean freerdp_peer_initialize(freerdp_peer* client) { client->context->rdp->settings->server_mode = true; client->context->rdp->state = CONNECTION_STATE_INITIAL; - if (client->context->rdp->settings->rdp_key_file != NULL) { + + if (client->context->rdp->settings->rdp_key_file != NULL) + { client->context->rdp->settings->server_key = key_new(client->context->rdp->settings->rdp_key_file); } @@ -43,12 +46,13 @@ static boolean freerdp_peer_get_fds(freerdp_peer* client, void** rfds, int* rcou static boolean freerdp_peer_check_fds(freerdp_peer* client) { - rdpRdp* rdp; int status; + rdpRdp* rdp; rdp = client->context->rdp; status = rdp_check_fds(rdp); + if (status < 0) return false; @@ -63,7 +67,6 @@ static boolean peer_recv_data_pdu(freerdp_peer* client, STREAM* s) uint8 compressed_type; uint16 compressed_len; - if (!rdp_read_share_data_header(s, &length, &type, &share_id, &compressed_type, &compressed_len)) return false; @@ -89,8 +92,10 @@ static boolean peer_recv_data_pdu(freerdp_peer* client, STREAM* s) break; case DATA_PDU_TYPE_FONT_LIST: + if (!rdp_server_accept_client_font_list_pdu(client->context->rdp, s)) return false; + if (client->PostConnect) { if (!client->PostConnect(client)) @@ -101,12 +106,14 @@ static boolean peer_recv_data_pdu(freerdp_peer* client, STREAM* s) */ client->PostConnect = NULL; } + if (client->Activate) { /* Activate will be called everytime after the client is activated/reactivated. */ if (!client->Activate(client)) return false; } + break; case DATA_PDU_TYPE_SHUTDOWN_REQUEST: @@ -123,7 +130,7 @@ static boolean peer_recv_data_pdu(freerdp_peer* client, STREAM* s) static boolean peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s) { - rdpRdp *rdp; + rdpRdp* rdp; uint16 length; uint16 pduType; uint16 pduLength; @@ -142,6 +149,7 @@ static boolean peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s) if (rdp->settings->encryption) { rdp_read_security_header(s, &securityFlags); + if (securityFlags & SEC_ENCRYPT) { if (!rdp_decrypt(rdp, s, length - 4, securityFlags)) @@ -181,8 +189,8 @@ static boolean peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s) static boolean peer_recv_fastpath_pdu(freerdp_peer* client, STREAM* s) { - uint16 length; rdpRdp* rdp; + uint16 length; rdpFastPath* fastpath; rdp = client->context->rdp; @@ -254,7 +262,9 @@ static boolean peer_recv_callback(rdpTransport* transport, STREAM* s, void* extr case CONNECTION_STATE_ESTABLISH_KEYS: if (!rdp_server_accept_client_info(client->context->rdp, s)) return false; + IFCALL(client->Capabilities, client); + if (!rdp_send_demand_active(client->context->rdp)) return false; break; @@ -332,6 +342,8 @@ freerdp_peer* freerdp_peer_new(int sockfd) client = xnew(freerdp_peer); + freerdp_tcp_set_no_delay(sockfd, true); + if (client != NULL) { client->sockfd = sockfd; @@ -354,4 +366,3 @@ void freerdp_peer_free(freerdp_peer* client) xfree(client); } } - diff --git a/libfreerdp-utils/tcp.c b/libfreerdp-utils/tcp.c index 5c51f11eb..b530c0213 100644 --- a/libfreerdp-utils/tcp.c +++ b/libfreerdp-utils/tcp.c @@ -171,3 +171,16 @@ int freerdp_tcp_disconnect(int sockfd) return 0; } + +int freerdp_tcp_set_no_delay(int sockfd, boolean no_delay) +{ + uint32 option_value; + socklen_t option_len; + + option_value = no_delay; + option_len = sizeof(option_value); + + setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void*) &option_value, option_len); + + return 0; +} diff --git a/server/X11/xf_input.c b/server/X11/xf_input.c index 649613647..3fdb29c24 100644 --- a/server/X11/xf_input.c +++ b/server/X11/xf_input.c @@ -44,11 +44,15 @@ void xf_input_keyboard_event(rdpInput* input, uint16 flags, uint16 code) #ifdef WITH_XTEST pthread_mutex_lock(&(xfp->mutex)); + XTestGrabControl(xfi->display, True); + if (flags & KBD_FLAGS_DOWN) XTestFakeKeyEvent(xfi->display, keycode, True, 0); else if (flags & KBD_FLAGS_RELEASE) XTestFakeKeyEvent(xfi->display, keycode, False, 0); + XTestGrabControl(xfi->display, False); + pthread_mutex_unlock(&(xfp->mutex)); #endif } @@ -68,6 +72,7 @@ void xf_input_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y) pthread_mutex_lock(&(xfp->mutex)); #ifdef WITH_XTEST + XTestGrabControl(xfi->display, True); if (flags & PTR_FLAGS_WHEEL) { @@ -99,6 +104,8 @@ void xf_input_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y) if (button != 0) XTestFakeButtonEvent(xfi->display, button, down, 0); } + + XTestGrabControl(xfi->display, False); #endif pthread_mutex_unlock(&(xfp->mutex)); } @@ -110,7 +117,9 @@ void xf_input_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint pthread_mutex_lock(&(xfp->mutex)); #ifdef WITH_XTEST + XTestGrabControl(xfi->display, True); XTestFakeMotionEvent(xfi->display, 0, x, y, CurrentTime); + XTestGrabControl(xfi->display, False); #endif pthread_mutex_unlock(&(xfp->mutex)); }