From e2e9f20bf2a081b292f5a27cc08d3f5ce84cb8e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C3=85strand?= Date: Mon, 11 Aug 2003 11:09:17 +0000 Subject: [PATCH] Applied IPv6 patch from mike@dexy.mine.nu. git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@439 423420c4-83ab-492f-b58f-81f9feb106b5 --- tcp.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/tcp.c b/tcp.c index 9a019c0..79dcb99 100644 --- a/tcp.c +++ b/tcp.c @@ -129,9 +129,48 @@ tcp_recv(STREAM s, uint32 length) BOOL tcp_connect(char *server) { + int true_value = 1; + +#ifdef IPv6 + + int n; + struct addrinfo hints, *res, *ressave; + char tcp_port_rdp_s[10]; + + snprintf(tcp_port_rdp_s, 10, "%d", tcp_port_rdp); + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + n = getaddrinfo(server, tcp_port_rdp_s, &hints, &res); + + if (n < 0) + { + error("getaddrinfo error:: [%s]\n", gai_strerror(n)); + return False; + } + + ressave = res; + sock = -1; + while (res) + { + sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if (!(sock < 0)) + { + if (connect(sock, res->ai_addr, res->ai_addrlen) == 0) + break; + close(sock); + sock = -1; + } + res = res->ai_next; + } + freeaddrinfo(ressave); + +#else /* no IPv6 support */ + struct hostent *nslookup; struct sockaddr_in servaddr; - int true_value = 1; if ((nslookup = gethostbyname(server)) != NULL) { @@ -159,6 +198,8 @@ tcp_connect(char *server) return False; } +#endif /* IPv6 */ + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *) &true_value, sizeof(true_value)); in.size = 4096;