libfreerdp-core: add server unix domain socket.

This commit is contained in:
Vic Lee 2012-05-22 18:53:11 +08:00
parent 11249bbb51
commit f4c8ebf13f
3 changed files with 54 additions and 3 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);