diff --git a/proto.h b/proto.h index e6a2fb7..4e9188b 100644 --- a/proto.h +++ b/proto.h @@ -207,6 +207,7 @@ STREAM tcp_recv(STREAM s, uint32 length); RD_BOOL tcp_connect(char *server); void tcp_disconnect(void); char *tcp_get_address(void); +RD_BOOL tcp_is_connected(void); void tcp_reset_state(void); RD_BOOL tcp_tls_connect(void); RD_BOOL tcp_tls_get_server_pubkey(STREAM s); diff --git a/rdesktop.c b/rdesktop.c index 28c545e..1f801dc 100644 --- a/rdesktop.c +++ b/rdesktop.c @@ -1023,7 +1023,8 @@ main(int argc, char *argv[]) rdp_main_loop(&deactivated, &ext_disc_reason); DEBUG(("Disconnecting...\n")); - rdp_disconnect(); + if (!tcp_is_connected()) + rdp_disconnect(); if (g_redirect) continue; diff --git a/tcp.c b/tcp.c index 2237f7b..f11bf64 100644 --- a/tcp.c +++ b/tcp.c @@ -515,6 +515,16 @@ tcp_get_address() return ipaddr; } +RD_BOOL +tcp_is_connected() +{ + struct sockaddr_in sockaddr; + socklen_t len = sizeof(sockaddr); + if (getpeername(g_sock, (struct sockaddr *) &sockaddr, &len)) + return True; + return False; +} + /* reset the state of the tcp layer */ /* Support for Session Directory */ void