X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=rdpsrv.c;h=a6064be6cf628188eae2bf608c7298aa1ae23f27;hb=b004cd46005404ab5636a623db4704e76f23d0e8;hp=43bf2a42d449faf1d11d2149355d92356e4134e6;hpb=8620fedb9b11c67f5eab4b07cbac9dce189f5858;p=rdpsrv diff --git a/rdpsrv.c b/rdpsrv.c index 43bf2a4..a6064be 100644 --- a/rdpsrv.c +++ b/rdpsrv.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -137,10 +138,36 @@ int vnc_init() printf("Server is %u x %u\n", ntohs(si.width), ntohs(si.height)); - if (read(vnc_sock, buf, si.name_len) != si.name_len) - error("short read on server name"); + if (read(vnc_sock, buf, ntohl(si.name_len)) != ntohl(si.name_len)) + error("short read on server name\n"); - printf("Server name is '%*s'\n", si.name_len, buf); + printf("Server name is '%*s' (%u bytes)\n", ntohl(si.name_len), buf, ntohl(si.name_len)); + + // we can only accept raw encoding + buf[0] = 2; // message type + buf[1] = 0; // padding + buf[2] = 0; // number of encodings + buf[3] = 1; + buf[4] = 0; // raw encoding + buf[5] = 0; + buf[6] = 0; + buf[7] = 0; + + write(vnc_sock, buf, 8); + + // request the entire framebuffer + buf[0] = 3; // message type + buf[1] = 0; // incremental + buf[2] = 0; // xpos + buf[3] = 0; + buf[4] = 0; // ypos + buf[5] = 0; + buf[6] = 640 >> 8; // width + buf[7] = 640 % 0xff; + buf[8] = 480 >> 8; // height + buf[9] = 480 % 0xff; + + write(vnc_sock, buf, 10); printf("Connected to VNC!\n"); @@ -159,24 +186,52 @@ 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 */ + // activity on VNC socket? + if (FD_ISSET(vnc_sock, &readfs)) { + unsigned char buf[256]; - switch (data_pdu_type) { - case RDP_DATA_PDU_INPUT: - printf("Input PDU\n"); - handle_input_pdu(s); + printf("Activity on VNC socket!\n"); + + read(vnc_sock, buf, 1); + switch (buf[0]) { + case 0: + // frame buffer update! + printf("Frame buffer update\n"); break; default: - printf("Unknown data PDU type %u\n", data_pdu_type); - }; + printf("Unknown server message %x\n", buf[0]); + exit(1); + } } } }