--- sourceforge.net/trunk/rdesktop/tcp.c 2003/08/11 11:09:17 440 +++ sourceforge.net/trunk/rdesktop/tcp.c 2005/03/31 10:49:59 872 @@ -1,7 +1,7 @@ /* rdesktop: A Remote Desktop Protocol client. Protocol services - TCP layer - Copyright (C) Matthew Chapman 1999-2002 + Copyright (C) Matthew Chapman 1999-2005 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ static int sock; static struct stream in; static struct stream out; -extern int tcp_port_rdp; +int g_tcp_port_rdp = TCP_PORT_RDP; /* Initialise TCP transport data packet */ STREAM @@ -112,11 +112,16 @@ return NULL; rcvd = recv(sock, s->end, length, 0); - if (rcvd <= 0) + if (rcvd < 0) { error("recv: %s\n", strerror(errno)); return NULL; } + else if (rcvd == 0) + { + error("Connection closed\n"); + return NULL; + } s->end += rcvd; length -= rcvd; @@ -137,17 +142,15 @@ struct addrinfo hints, *res, *ressave; char tcp_port_rdp_s[10]; - snprintf(tcp_port_rdp_s, 10, "%d", tcp_port_rdp); + snprintf(tcp_port_rdp_s, 10, "%d", g_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) + if ((n = getaddrinfo(server, tcp_port_rdp_s, &hints, &res))) { - error("getaddrinfo error:: [%s]\n", gai_strerror(n)); + error("getaddrinfo: %s\n", gai_strerror(n)); return False; } @@ -167,6 +170,12 @@ } freeaddrinfo(ressave); + if (sock == -1) + { + error("%s: unable to connect\n", server); + return False; + } + #else /* no IPv6 support */ struct hostent *nslookup; @@ -189,7 +198,7 @@ } servaddr.sin_family = AF_INET; - servaddr.sin_port = htons(tcp_port_rdp); + servaddr.sin_port = htons(g_tcp_port_rdp); if (connect(sock, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)) < 0) { @@ -217,3 +226,19 @@ { close(sock); } + +char * +tcp_get_address() +{ + static char ipaddr[32]; + struct sockaddr_in sockaddr; + socklen_t len = sizeof(sockaddr); + if (getsockname(sock, (struct sockaddr *) &sockaddr, &len) == 0) + { + unsigned char *ip = (unsigned char *) &sockaddr.sin_addr; + sprintf(ipaddr, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); + } + else + strcpy(ipaddr, "127.0.0.1"); + return ipaddr; +}