FreeRDP
Loading...
Searching...
No Matches
mfreerdp.c
1
21#include <freerdp/config.h>
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26#include <errno.h>
27#include <pthread.h>
28#include <signal.h>
29#include <sys/time.h>
30
31#include <CoreGraphics/CGEvent.h>
32
33#include <winpr/crt.h>
34#include <winpr/wtsapi.h>
35#include <winpr/assert.h>
36
37#include <freerdp/freerdp.h>
38#include <freerdp/constants.h>
39#include <freerdp/channels/wtsvc.h>
40#include <freerdp/channels/channels.h>
41#include <freerdp/server/server-common.h>
42
43#include "mfreerdp.h"
44#include "mf_peer.h"
45
46#include <freerdp/log.h>
47#define TAG SERVER_TAG("mac")
48
49static void mf_server_main_loop(freerdp_listener* instance)
50{
51 WINPR_ASSERT(instance);
52 WINPR_ASSERT(instance->GetEventHandles);
53 WINPR_ASSERT(instance->CheckFileDescriptor);
54
55 while (1)
56 {
57 DWORD status;
58 HANDLE handles[MAXIMUM_WAIT_OBJECTS] = WINPR_C_ARRAY_INIT;
59 DWORD count = instance->GetEventHandles(instance, handles, ARRAYSIZE(handles));
60
61 if (count == 0)
62 {
63 WLog_ERR(TAG, "Failed to get FreeRDP file descriptor");
64 break;
65 }
66
67 status = WaitForMultipleObjects(count, handles, FALSE, INFINITE);
68 if (status == WAIT_FAILED)
69 {
70 WLog_ERR(TAG, "WaitForMultipleObjects failed");
71 break;
72 }
73
74 if (instance->CheckFileDescriptor(instance) != TRUE)
75 {
76 break;
77 }
78 }
79
80 instance->Close(instance);
81}
82
83int main(int argc, char* argv[])
84{
85 freerdp_server_warn_unmaintained(argc, argv);
86 mf_server_info info = { .key = "server.key", .cert = "server.crt" };
87
88 freerdp_listener* instance;
89
90 signal(SIGPIPE, SIG_IGN);
91
92 if (!WTSRegisterWtsApiFunctionTable(FreeRDP_InitWtsApi()))
93 return -1;
94
95 if (!(instance = freerdp_listener_new()))
96 return 1;
97
98 instance->info = &info;
99 instance->PeerAccepted = mf_peer_accepted;
100
101 if (instance->Open(instance, nullptr, 3389))
102 {
103 mf_server_main_loop(instance);
104 }
105
106 freerdp_listener_free(instance);
107
108 return 0;
109}