diff --git a/src/syncterm/conn_pty.c b/src/syncterm/conn_pty.c index 024713a2c3ec064c8199b594f3e1d31b47abdd79..232ab7fb16da7556ef379b7e56ca8c44eab8b34a 100644 --- a/src/syncterm/conn_pty.c +++ b/src/syncterm/conn_pty.c @@ -502,6 +502,7 @@ int pty_connect(struct bbslist *bbs) int pty_close(void) { time_t start; + char garbage[1024]; conn_api.terminate=1; start=time(NULL); @@ -515,8 +516,10 @@ int pty_close(void) kill(child_pid, SIGKILL); waitpid(child_pid, &status, 0); - while(conn_api.input_thread_running || conn_api.output_thread_running) + while(conn_api.input_thread_running || conn_api.output_thread_running) { + conn_recv_upto(garbage, sizeof(garbage), 0); SLEEP(1); + } destroy_conn_buf(&conn_inbuf); destroy_conn_buf(&conn_outbuf); FREE_AND_NULL(conn_api.rd_buf); diff --git a/src/syncterm/conn_telnet.c b/src/syncterm/conn_telnet.c index 29e50fbda94134e8365213fb761c2d73c5340234..2490108add3af01decb028c3a42bb17f3addb759 100644 --- a/src/syncterm/conn_telnet.c +++ b/src/syncterm/conn_telnet.c @@ -170,10 +170,14 @@ int telnet_connect(struct bbslist *bbs) int telnet_close(void) { + char garbage[1024]; + conn_api.terminate=1; closesocket(telnet_sock); - while(conn_api.input_thread_running || conn_api.output_thread_running) + while(conn_api.input_thread_running || conn_api.output_thread_running) { + conn_recv_upto(garbage, sizeof(garbage), 0); SLEEP(1); + } destroy_conn_buf(&conn_inbuf); destroy_conn_buf(&conn_outbuf); FREE_AND_NULL(conn_api.rd_buf); diff --git a/src/syncterm/modem.c b/src/syncterm/modem.c index 22120ab349c75d15019619391d12abe4d1299a6a..3951856133f048baa3b1c73ca5ab0e2533cea34a 100644 --- a/src/syncterm/modem.c +++ b/src/syncterm/modem.c @@ -313,6 +313,7 @@ int serial_close(void) int modem_close(void) { time_t start; + char garbage[1024]; conn_api.terminate=1; @@ -333,8 +334,10 @@ int modem_close(void) } CLOSEIT: - while(conn_api.input_thread_running || conn_api.output_thread_running) + while(conn_api.input_thread_running || conn_api.output_thread_running) { + conn_recv_upto(garbage, sizeof(garbage), 0); SLEEP(1); + } comClose(com); destroy_conn_buf(&conn_inbuf); diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c index 865478278b52d00b60e919c1958f908a6a1dcfce..5351e13237fc7d11b988515a27163868c34ca42a 100644 --- a/src/syncterm/rlogin.c +++ b/src/syncterm/rlogin.c @@ -174,10 +174,14 @@ int rlogin_connect(struct bbslist *bbs) int rlogin_close(void) { + char garbage[1024]; + conn_api.terminate=1; closesocket(sock); - while(conn_api.input_thread_running || conn_api.output_thread_running) + while(conn_api.input_thread_running || conn_api.output_thread_running) { + conn_recv_upto(garbage, sizeof(garbage), 0); SLEEP(1); + } destroy_conn_buf(&conn_inbuf); destroy_conn_buf(&conn_outbuf); FREE_AND_NULL(conn_api.rd_buf); diff --git a/src/syncterm/ssh.c b/src/syncterm/ssh.c index 8ec4ebbaf277dc07aa44ae322564069bd822ea6f..e2be607e3863c19ab846fe1dbc4f998059c11b3f 100644 --- a/src/syncterm/ssh.c +++ b/src/syncterm/ssh.c @@ -295,11 +295,15 @@ int ssh_connect(struct bbslist *bbs) int ssh_close(void) { + char garbage[1024]; + conn_api.terminate=1; ssh_active=FALSE; cl.SetAttribute(ssh_session, CRYPT_SESSINFO_ACTIVE, 0); - while(conn_api.input_thread_running || conn_api.output_thread_running) + while(conn_api.input_thread_running || conn_api.output_thread_running) { + conn_recv_upto(garbage, sizeof(garbage), 0); SLEEP(1); + } cl.DestroySession(ssh_session); closesocket(sock); sock=INVALID_SOCKET; diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c index 0f1a36d83592266b3af2fd60398382fa181ec4b5..b36432d27e5d41c21d796cf58004902d79cfbc47 100644 --- a/src/syncterm/syncterm.c +++ b/src/syncterm/syncterm.c @@ -1612,6 +1612,8 @@ int main(int argc, char **argv) last_bbs=strdup(bbs->name); bbs=NULL; } + if (last_bbs) + free(last_bbs); // Save changed settings if(getscaling() > 0 && getscaling() != settings.scaling_factor) { char inipath[MAX_PATH+1];