diff --git a/rdesktop.c b/rdesktop.c index 4569a01..3f8a700 100644 --- a/rdesktop.c +++ b/rdesktop.c @@ -124,6 +124,7 @@ uint32 g_reconnect_logonid = 0; char g_reconnect_random[16]; time_t g_reconnect_random_ts; RD_BOOL g_has_reconnect_random = False; +RD_BOOL g_reconnect_loop = False; uint8 g_client_random[SEC_RANDOM_SIZE]; RD_BOOL g_pending_resize = False; @@ -497,7 +498,6 @@ main(int argc, char *argv[]) char password[64]; char shell[256]; char directory[256]; - RD_BOOL reconnect_loop; RD_BOOL prompt_password, deactivated; struct passwd *pw; uint32 flags, ext_disc_reason = 0; @@ -1084,7 +1084,7 @@ main(int argc, char *argv[]) lspci_init(); rdpdr_init(); - reconnect_loop = False; + g_reconnect_loop = False; while (1) { rdesktop_reset_state(); @@ -1106,7 +1106,7 @@ main(int argc, char *argv[]) g_network_error = False; - if (reconnect_loop == False) + if (g_reconnect_loop == False) return EX_PROTOCOL; /* check if auto reconnect cookie has timed out */ @@ -1120,6 +1120,9 @@ main(int argc, char *argv[]) continue; } + g_network_error = False; + + /* By setting encryption to False here, we have an encrypted login packet but unencrypted transfer of other packets */ if (!g_packet_encryption) @@ -1137,7 +1140,7 @@ main(int argc, char *argv[]) } g_redirect = False; - reconnect_loop = False; + g_reconnect_loop = False; rdp_main_loop(&deactivated, &ext_disc_reason); DEBUG(("Disconnecting...\n")); @@ -1153,7 +1156,7 @@ main(int argc, char *argv[]) fprintf(stderr, "Disconnected due to network error, retrying to reconnect for %d minutes.\n", RECONNECT_TIMEOUT/60); g_network_error = False; - reconnect_loop = True; + g_reconnect_loop = True; continue; } @@ -1164,7 +1167,7 @@ main(int argc, char *argv[]) if (g_pending_resize) { g_pending_resize = False; - reconnect_loop = True; + g_reconnect_loop = True; continue; } break; diff --git a/tcp.c b/tcp.c index 9a254c5..99b7b7f 100644 --- a/tcp.c +++ b/tcp.c @@ -65,6 +65,7 @@ static struct stream g_out[STREAM_COUNT]; int g_tcp_port_rdp = TCP_PORT_RDP; extern RD_BOOL g_user_quit; extern RD_BOOL g_network_error; +extern RD_BOOL g_reconnect_loop; /* wait till socket is ready to write or timeout */ static RD_BOOL @@ -467,7 +468,9 @@ tcp_connect(char *server) if (connect(g_sock, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)) < 0) { - error("connect: %s\n", TCP_STRERROR); + if (!g_reconnect_loop) + error("connect: %s\n", TCP_STRERROR); + TCP_CLOSE(g_sock); return False; }