forked from FreeRDP/FreeRDP
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
xfreerdp-server: implement interface
- Loading branch information
1 parent
5f4342f
commit 037d6ed
Showing
5 changed files
with
237 additions
and
82 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
/** | ||
* FreeRDP: A Remote Desktop Protocol Implementation | ||
* FreeRDP X11 Server Interface | ||
* | ||
* Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#include <errno.h> | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
#include <X11/Xlib.h> | ||
#include <X11/Xutil.h> | ||
#include <sys/select.h> | ||
#include <sys/signal.h> | ||
|
||
#include "xf_peer.h" | ||
#include "xfreerdp.h" | ||
|
||
#include "xf_interface.h" | ||
|
||
void* xf_server_thread(void* param) | ||
{ | ||
int i; | ||
int fds; | ||
int max_fds; | ||
int rcount; | ||
void* rfds[32]; | ||
fd_set rfds_set; | ||
xfServer* server; | ||
freerdp_listener* listener; | ||
|
||
ZeroMemory(rfds, sizeof(rfds)); | ||
|
||
server = (xfServer*) param; | ||
listener = server->listener; | ||
|
||
while (1) | ||
{ | ||
rcount = 0; | ||
|
||
if (listener->GetFileDescriptor(listener, rfds, &rcount) != TRUE) | ||
{ | ||
fprintf(stderr, "Failed to get FreeRDP file descriptor\n"); | ||
break; | ||
} | ||
|
||
max_fds = 0; | ||
FD_ZERO(&rfds_set); | ||
|
||
for (i = 0; i < rcount; i++) | ||
{ | ||
fds = (int)(long)(rfds[i]); | ||
|
||
if (fds > max_fds) | ||
max_fds = fds; | ||
|
||
FD_SET(fds, &rfds_set); | ||
} | ||
|
||
if (max_fds == 0) | ||
break; | ||
|
||
if (select(max_fds + 1, &rfds_set, NULL, NULL, NULL) == -1) | ||
{ | ||
/* these are not really errors */ | ||
if (!((errno == EAGAIN) || | ||
(errno == EWOULDBLOCK) || | ||
(errno == EINPROGRESS) || | ||
(errno == EINTR))) /* signal occurred */ | ||
{ | ||
fprintf(stderr, "select failed\n"); | ||
break; | ||
} | ||
} | ||
|
||
if (listener->CheckFileDescriptor(listener) != TRUE) | ||
{ | ||
fprintf(stderr, "Failed to check FreeRDP file descriptor\n"); | ||
break; | ||
} | ||
} | ||
|
||
listener->Close(listener); | ||
|
||
return NULL; | ||
} | ||
|
||
int freerdp_server_global_init() | ||
{ | ||
/* | ||
* ignore SIGPIPE, otherwise an SSL_write failure could crash the server | ||
*/ | ||
signal(SIGPIPE, SIG_IGN); | ||
|
||
return 0; | ||
} | ||
|
||
int freerdp_server_global_uninit() | ||
{ | ||
return 0; | ||
} | ||
|
||
int freerdp_server_start(xfServer* server) | ||
{ | ||
if (server->listener->Open(server->listener, NULL, 3389)) | ||
{ | ||
server->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) xf_thread, (void*) server, 0, NULL); | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
int freerdp_server_stop(xfServer* server) | ||
{ | ||
return 0; | ||
} | ||
|
||
xfServer* freerdp_server_new(int argc, char** argv) | ||
{ | ||
xfServer* server; | ||
|
||
server = (xfServer*) malloc(sizeof(xfServer)); | ||
|
||
if (server) | ||
{ | ||
server->listener = freerdp_listener_new(); | ||
server->listener->PeerAccepted = xf_peer_accepted; | ||
} | ||
|
||
return server; | ||
} | ||
|
||
void freerdp_server_free(xfServer* server) | ||
{ | ||
if (server) | ||
{ | ||
freerdp_listener_free(server->listener); | ||
free(server); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
/** | ||
* FreeRDP: A Remote Desktop Protocol Implementation | ||
* FreeRDP X11 Server Interface | ||
* | ||
* Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com> | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#ifndef XFREERDP_SERVER_INTERFACE_H | ||
#define XFREERDP_SERVER_INTERFACE_H | ||
|
||
#include <freerdp/api.h> | ||
#include <freerdp/freerdp.h> | ||
|
||
typedef struct xf_info xfInfo; | ||
typedef struct xf_server xfServer; | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/** | ||
* Server Interface | ||
*/ | ||
|
||
FREERDP_API int freerdp_server_global_init(); | ||
FREERDP_API int freerdp_server_global_uninit(); | ||
|
||
FREERDP_API int freerdp_server_start(xfServer* server); | ||
FREERDP_API int freerdp_server_stop(xfServer* server); | ||
|
||
FREERDP_API xfServer* freerdp_server_new(int argc, char** argv); | ||
FREERDP_API void freerdp_server_free(xfServer* server); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* XFREERDP_SERVER_INTERFACE_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters