From f4c8ebf13f81e4bf3a7f65490e64bdcd3178f30e Mon Sep 17 00:00:00 2001 From: Vic Lee Date: Tue, 22 May 2012 18:53:11 +0800 Subject: [PATCH] libfreerdp-core: add server unix domain socket. --- include/freerdp/listener.h | 2 ++ libfreerdp-core/listener.c | 52 ++++++++++++++++++++++++++++++++++++++++++++-- server/test/tfreerdp.c | 3 ++- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/include/freerdp/listener.h b/include/freerdp/listener.h index 6b0a256..e007cc6 100644 --- a/include/freerdp/listener.h +++ b/include/freerdp/listener.h @@ -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; diff --git a/libfreerdp-core/listener.c b/libfreerdp-core/listener.c index 2fb15a0..e3b9765 100644 --- a/libfreerdp-core/listener.c +++ b/libfreerdp-core/listener.c @@ -26,6 +26,7 @@ #ifndef _WIN32 #include #include +#include #include #include #include @@ -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; diff --git a/server/test/tfreerdp.c b/server/test/tfreerdp.c index aef1206..09becdc 100644 --- a/server/test/tfreerdp.c +++ b/server/test/tfreerdp.c @@ -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); -- 2.7.4