From: Steinar H. Gunderson Date: Fri, 4 Feb 2005 16:09:37 +0000 (+0000) Subject: select() both the RDP and VNC sockets. X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=commitdiff_plain;h=cb78b4571e17e9c6c5463f871c69c1fd0603cf60 select() both the RDP and VNC sockets. --- diff --git a/proto.h b/proto.h index 00ab7a0..7170509 100644 --- a/proto.h +++ b/proto.h @@ -121,6 +121,7 @@ STREAM tcp_recv(STREAM s, uint32 length); BOOL tcp_recv_connect(int server_sock); int tcp_connect(char *server, int port); void tcp_disconnect(void); +int tcp_get_socket(void); /* xclip.c */ void ui_clip_format_announce(uint8 * data, uint32 length); void ui_clip_handle_data(uint8 * data, uint32 length); diff --git a/rdpsrv.c b/rdpsrv.c index b1b5ea7..9b198ef 100644 --- a/rdpsrv.c +++ b/rdpsrv.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -182,24 +183,39 @@ int serve_client() uint8 type, data_pdu_type; STREAM s; - while ((s = rdp_recv(&type)) != NULL) { - if (type != RDP_PDU_DATA) { - printf("Unknown RDP packet of type %u\n", type); - continue; + fd_set readfs; + FD_ZERO(&readfs); + FD_SET(tcp_get_socket(), &readfs); + FD_SET(vnc_sock, &readfs); + + select(FD_SETSIZE, &readfs, NULL, NULL, NULL); + + // activity on RDP socket? + if (FD_ISSET(tcp_get_socket(), &readfs)) { + if ((s = rdp_recv(&type)) != NULL) { + if (type != RDP_PDU_DATA) { + printf("Unknown RDP packet of type %u\n", type); + continue; + } + + in_uint8s(s, 8); /* shareid, pad, streamid, length */ + in_uint8(s, data_pdu_type); + in_uint8s(s, 3); /* compress_type, compress_len */ + + switch (data_pdu_type) { + case RDP_DATA_PDU_INPUT: + printf("Input PDU\n"); + handle_input_pdu(s); + break; + default: + printf("Unknown data PDU type %u\n", data_pdu_type); + }; } + } - in_uint8s(s, 8); /* shareid, pad, streamid, length */ - in_uint8(s, data_pdu_type); - in_uint8s(s, 3); /* compress_type, compress_len */ - - switch (data_pdu_type) { - case RDP_DATA_PDU_INPUT: - printf("Input PDU\n"); - handle_input_pdu(s); - break; - default: - printf("Unknown data PDU type %u\n", data_pdu_type); - }; + // activity on VNC socket? + if (FD_ISSET(vnc_sock, &readfs)) { + printf("Activity on VNC socket!\n"); } } } diff --git a/tcp.c b/tcp.c index 30aecad..0ae0d76 100644 --- a/tcp.c +++ b/tcp.c @@ -256,3 +256,9 @@ tcp_disconnect(void) { close(sock); } + +// hack? :-) +int tcp_get_socket(void) +{ + return sock; +}