From 5c98e983870e071cfb5ef8e87c1be8223ccfc80b Mon Sep 17 00:00:00 2001 From: Vic Lee Date: Sun, 3 Jul 2011 15:53:55 +0800 Subject: [PATCH] libfreerdp-core/transport: add connect and disconnect code. --- libfreerdp-core/transport.c | 85 +++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/libfreerdp-core/transport.c b/libfreerdp-core/transport.c index 1cd116eef..ac1b44601 100644 --- a/libfreerdp-core/transport.c +++ b/libfreerdp-core/transport.c @@ -23,6 +23,10 @@ #include #include +#include +#include +#include + #include "transport.h" rdpTransport * @@ -33,6 +37,8 @@ transport_new(void) transport = (rdpTransport *) xmalloc(sizeof(rdpTransport)); memset(transport, 0, sizeof(rdpTransport)); + transport->sockfd = -1; + return transport; } @@ -42,15 +48,94 @@ transport_free(rdpTransport * transport) xfree(transport); } +static int +transport_connect_sockfd(rdpTransport * transport, const char * server, int port) +{ + struct addrinfo hints = { 0 }; + struct addrinfo * res, * ai; + int r; + char servname[10]; + int sockfd = -1; + + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + snprintf(servname, sizeof(servname), "%d", port); + r = getaddrinfo(server, servname, &hints, &res); + if (r != 0) + { + printf("transport_connect: getaddrinfo (%s)\n", gai_strerror(r)); + return -1; + } + + for (ai = res; ai; ai = ai->ai_next) + { + sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if (sockfd < 0) + continue; + + r = connect(sockfd, ai->ai_addr, ai->ai_addrlen); + if (r == 0) + { + printf("connected to %s:%s\n", server, servname); + break; + } + + sockfd = -1; + } + freeaddrinfo(res); + + if (sockfd == -1) + { + printf("unable to connect to %s:%s\n", server, servname); + return -1; + } + + transport->sockfd = sockfd; + + return 0; +} + +static int +transport_configure_sockfd(rdpTransport * transport) +{ + int flags; + + flags = fcntl(transport->sockfd, F_GETFL); + if (flags == -1) + { + printf("transport_configure_sockfd: fcntl failed.\n"); + return -1; + } + fcntl(transport->sockfd, F_SETFL, flags | O_NONBLOCK); + + return 0; +} + int transport_connect(rdpTransport * transport, const char * server, int port) { + int r; + + r = transport_connect_sockfd(transport, server, port); + if (r != 0) + return r; + + r = transport_configure_sockfd(transport); + if (r != 0) + return r; + return 0; } int transport_disconnect(rdpTransport * transport) { + if (transport->sockfd != -1) + { + close(transport->sockfd); + transport->sockfd = -1; + } return 0; }