]> git.sesse.net Git - rdpsrv/blob - rdpsrv.c
Give up X server for now, connect to VNC on localhost instead.
[rdpsrv] / rdpsrv.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include <sys/socket.h>
6 #include <sys/ioctl.h>
7 #include <arpa/inet.h>
8
9 #include "rdesktop.h"
10
11 const int tcp_port_rdp = 3389;
12 int create_server_socket();
13 int serve_client();
14
15 int main()
16 {
17         int server_sock = create_server_socket();
18         for ( ;; ) {
19                 iso_recv_connect(server_sock);
20                 printf("Got connection.\n");
21                 serve_client();
22                 printf("Client closed.\n");
23         }
24 }
25
26 int create_server_socket()
27 {
28         int server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
29         const unsigned int one = 1, zero = 0;
30         struct sockaddr_in addr;
31         int err;
32
33         setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
34         ioctl(server_sock, FIONBIO, &zero);
35
36         addr.sin_family = AF_INET;
37         addr.sin_addr.s_addr = INADDR_ANY;
38         addr.sin_port = htons(tcp_port_rdp);
39
40         do {
41                 err = bind(server_sock, (struct sockaddr *)&addr, sizeof(struct sockaddr));
42
43                 if (err == -1) {
44                         perror("bind()");
45
46                         /* try to recover from recoverable errors... */
47                         if (errno == ENOMEM || errno == EADDRINUSE) {
48                                 puts("Waiting 1 sec before trying again...");
49                                 sleep(1);
50                         } else {
51                                 puts("Giving up.");
52                                 exit(1);
53                         }
54                 }
55         } while (err == -1);
56
57         listen(server_sock, 20);
58         return server_sock;
59 }
60
61 void handle_input_pdu(STREAM s)
62 {
63         uint32 time;
64         uint16 message_type, device_flags, param1, param2;
65         uint16 num_events;
66         int i;
67
68         in_uint16_le(s, num_events);   // number of events
69         in_uint8s(s, 2);        // pad
70
71         for (i = 0; i < num_events; ++i) {
72                 rdp_recv_input(s, &time, &message_type, &device_flags, &param1, &param2);
73                 printf("Input event at time %u\n", time);
74                 
75                 switch (message_type) {
76                 case RDP_INPUT_SYNCHRONIZE:
77                         printf("- Type: Synchronize (ignored)\n");
78                         break;
79                 case RDP_INPUT_CODEPOINT:
80                         printf("- Type: Codepoint (ignored)\n");
81                         break;
82                 case RDP_INPUT_VIRTKEY:
83                         printf("- Type: Virtual key (ignored)\n");
84                         break;
85                 case RDP_INPUT_SCANCODE:
86                         printf("- Type: Scancode (ignored)\n");
87                         break;
88                 case RDP_INPUT_MOUSE:
89                         printf("- Type: Mouse\n");
90                         printf("- Device flags: %x\n", device_flags);
91                         printf("- Position: (%u,%u)\n", param1, param2);
92
93                         // debug
94                         rdp_send_bitmap_update(param1, param2);
95                         
96                         break;
97                 default:
98                         printf("- Unknown type %x\n", message_type);
99                         break;
100                 }
101                 printf("\n");
102         }
103 }
104
105 int serve_client()
106 {
107         // connect to VNC
108         int vnc_sock = tcp_connect("127.0.0.1", 5901);
109         
110         if (!mcs_recv_connect_initial())
111                 error("MCS_CONNECT_INITIAL recv failed");
112         mcs_send_connect_response();
113
114         for ( ;; ) {
115                 uint8 type, data_pdu_type;
116                 STREAM s;
117
118                 while ((s = rdp_recv(&type)) != NULL) {
119                         if (type != RDP_PDU_DATA) {
120                                 printf("Unknown RDP packet of type %u\n", type);
121                                 continue;
122                         }
123
124                         in_uint8s(s, 8);        /* shareid, pad, streamid, length */
125                         in_uint8(s, data_pdu_type);
126                         in_uint8s(s, 3);        /* compress_type, compress_len */
127
128                         switch (data_pdu_type) {
129                         case RDP_DATA_PDU_INPUT:
130                                 printf("Input PDU\n");
131                                 handle_input_pdu(s);
132                                 break;
133                         default:
134                                 printf("Unknown data PDU type %u\n", data_pdu_type);
135                         };
136                 }
137         }
138 }