+
+ // re-request the entire framebuffer
+ buf[0] = 3; // message type
+ buf[1] = 1; // 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);
+}
+
+void handle_control_pdu(STREAM s)
+{
+ uint16 action, userid;
+ uint32 control_id;
+
+ in_uint16_le(s, action);
+ in_uint16_le(s, userid);
+ in_uint32(s, control_id);
+
+ printf("Control PDU: action=%hu userid=%hu control_id=%u\n", action, userid, control_id);
+
+ switch (action) {
+ case RDP_CTL_COOPERATE:
+ printf("Cooperate\n");
+ rdp_send_control(RDP_CTL_COOPERATE);
+ break;
+ case RDP_CTL_REQUEST_CONTROL:
+ printf("Client requesting control; granting\n");
+ rdp_send_control(RDP_CTL_GRANT_CONTROL);
+ break;
+ default:
+ printf("Unhandled\n");
+ }
+}
+
+void
+handle_font2_pdu(STREAM s)
+{
+ printf("FONT2 PDU, responding with magic\n");
+
+ s = rdp_init_data(8);
+ out_uint16_le(s, 0);
+ out_uint16_le(s, 0);
+ out_uint16_le(s, 3);
+ out_uint16_le(s, 4);
+ s_mark_end(s);
+ rdp_send_data(s, 0x28);