mirror of https://github.com/FreeRDP/FreeRDP
libfreerdp-core: add server unix domain socket.
This commit is contained in:
parent
11249bbb51
commit
f4c8ebf13f
|
@ -32,6 +32,7 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
typedef boolean (*psListenerOpen)(freerdp_listener* instance, const char* bind_address, uint16 port);
|
||||
typedef boolean (*psListenerOpenLocal)(freerdp_listener* instance, const char* path);
|
||||
typedef boolean (*psListenerGetFileDescriptor)(freerdp_listener* instance, void** rfds, int* rcount);
|
||||
typedef boolean (*psListenerCheckFileDescriptor)(freerdp_listener* instance);
|
||||
typedef void (*psListenerClose)(freerdp_listener* instance);
|
||||
|
@ -47,6 +48,7 @@ struct rdp_freerdp_listener
|
|||
void* param4;
|
||||
|
||||
psListenerOpen Open;
|
||||
psListenerOpenLocal OpenLocal;
|
||||
psListenerGetFileDescriptor GetFileDescriptor;
|
||||
psListenerCheckFileDescriptor CheckFileDescriptor;
|
||||
psListenerClose Close;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#ifndef _WIN32
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/un.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
|
@ -121,6 +122,50 @@ static boolean freerdp_listener_open(freerdp_listener* instance, const char* bin
|
|||
return (listener->num_sockfds > 0 ? true : false);
|
||||
}
|
||||
|
||||
static boolean freerdp_listener_open_local(freerdp_listener* instance, const char* path)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
rdpListener* listener = (rdpListener*)instance->listener;
|
||||
int status;
|
||||
int sockfd;
|
||||
struct sockaddr_un addr;
|
||||
|
||||
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (sockfd == -1)
|
||||
{
|
||||
perror("socket");
|
||||
return false;
|
||||
}
|
||||
|
||||
addr.sun_family = AF_UNIX;
|
||||
strncpy(addr.sun_path, path, sizeof(addr.sun_path));
|
||||
unlink(path);
|
||||
status = bind(sockfd, (struct sockaddr *) &addr, sizeof(addr));
|
||||
if (status != 0)
|
||||
{
|
||||
perror("bind");
|
||||
close(sockfd);
|
||||
return false;
|
||||
}
|
||||
|
||||
status = listen(sockfd, 10);
|
||||
if (status != 0)
|
||||
{
|
||||
perror("listen");
|
||||
close(sockfd);
|
||||
return false;
|
||||
}
|
||||
|
||||
listener->sockfds[listener->num_sockfds++] = sockfd;
|
||||
|
||||
printf("Listening on socket %s.\n", addr.sun_path);
|
||||
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void freerdp_listener_close(freerdp_listener* instance)
|
||||
{
|
||||
int i;
|
||||
|
@ -187,12 +232,14 @@ static boolean freerdp_listener_check_fds(freerdp_listener* instance)
|
|||
|
||||
client = freerdp_peer_new(peer_sockfd);
|
||||
|
||||
sin_addr = NULL;
|
||||
if (peer_addr.ss_family == AF_INET)
|
||||
sin_addr = &(((struct sockaddr_in*) &peer_addr)->sin_addr);
|
||||
else
|
||||
else if (peer_addr.ss_family == AF_INET6)
|
||||
sin_addr = &(((struct sockaddr_in6*) &peer_addr)->sin6_addr);
|
||||
|
||||
inet_ntop(peer_addr.ss_family, sin_addr, client->hostname, sizeof(client->hostname));
|
||||
if (sin_addr)
|
||||
inet_ntop(peer_addr.ss_family, sin_addr, client->hostname, sizeof(client->hostname));
|
||||
|
||||
IFCALL(instance->PeerAccepted, instance, client);
|
||||
}
|
||||
|
@ -207,6 +254,7 @@ freerdp_listener* freerdp_listener_new(void)
|
|||
|
||||
instance = xnew(freerdp_listener);
|
||||
instance->Open = freerdp_listener_open;
|
||||
instance->OpenLocal = freerdp_listener_open_local;
|
||||
instance->GetFileDescriptor = freerdp_listener_get_fds;
|
||||
instance->CheckFileDescriptor = freerdp_listener_check_fds;
|
||||
instance->Close = freerdp_listener_close;
|
||||
|
|
|
@ -756,7 +756,8 @@ int main(int argc, char* argv[])
|
|||
test_dump_rfx_realtime = false;
|
||||
|
||||
/* Open the server socket and start listening. */
|
||||
if (instance->Open(instance, NULL, 3389))
|
||||
if (instance->Open(instance, NULL, 3389) &&
|
||||
instance->OpenLocal(instance, "/tmp/tfreerdp-server.0"))
|
||||
{
|
||||
/* Entering the server main loop. In a real server the listener can be run in its own thread. */
|
||||
test_server_mainloop(instance);
|
||||
|
|
Loading…
Reference in New Issue