diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c index 215100195fdef5e82788c7466cca3558c71c3101..5bc18fbc79e55af0a103fd7f7063a7312f287789 100644 --- a/src/syncterm/conn.c +++ b/src/syncterm/conn.c @@ -484,7 +484,7 @@ enum failure_reason { }; SOCKET -conn_socket_connect(struct bbslist *bbs) +conn_socket_connect(struct bbslist *bbs, bool can_cancel) { SOCKET sock = INVALID_SOCKET; #ifdef _WIN32 @@ -531,9 +531,11 @@ conn_socket_connect(struct bbslist *bbs) uifc.pop("Connecting..."); } - /* Drain the input buffer to avoid accidental cancel */ - while (kbhit()) - getch(); + if (can_cancel) { + /* Drain the input buffer to avoid accidental cancel */ + while (kbhit()) + getch(); + } for (cur = res; cur && sock == INVALID_SOCKET && failcode == FAILURE_WHAT_FAILURE; cur = cur->ai_next) { if (sock == INVALID_SOCKET) { @@ -549,6 +551,7 @@ conn_socket_connect(struct bbslist *bbs) } if (connect(sock, cur->ai_addr, cur->ai_addrlen)) { + int tries = 0; switch (ERROR_VALUE) { case EINPROGRESS: case EINTR: @@ -558,7 +561,13 @@ conn_socket_connect(struct bbslist *bbs) #endif for (; sock != INVALID_SOCKET;) { if (socket_writable(sock, 1000)) { - if (socket_recvdone(sock, 0)) { + tries++; + if (tries >= 5 && !can_cancel) { + closesocket(sock); + sock = INVALID_SOCKET; + continue; + } + else if (socket_recvdone(sock, 0)) { closesocket(sock); sock = INVALID_SOCKET; continue; @@ -568,10 +577,12 @@ conn_socket_connect(struct bbslist *bbs) } } else { - if (kbhit()) { - failcode = FAILURE_ABORTED; - closesocket(sock); - sock = INVALID_SOCKET; + if (can_cancel) { + if (kbhit()) { + failcode = FAILURE_ABORTED; + closesocket(sock); + sock = INVALID_SOCKET; + } } } } diff --git a/src/syncterm/conn.h b/src/syncterm/conn.h index 3c7a1275e1afdf435887989d249f97b79c3a529f..fb5893c9b067322b5395b8ed0a83fe75c0ab3383 100644 --- a/src/syncterm/conn.h +++ b/src/syncterm/conn.h @@ -124,6 +124,6 @@ size_t conn_buf_wait_cond(struct conn_buffer *buf, size_t bcount, unsigned long #define conn_buf_wait_bytes(buf, count, timeout) conn_buf_wait_cond(buf, count, timeout, 0) #define conn_buf_wait_free(buf, count, timeout) conn_buf_wait_cond(buf, count, timeout, 1) -SOCKET conn_socket_connect(struct bbslist *bbs); +SOCKET conn_socket_connect(struct bbslist *bbs, bool can_cancel); #endif // ifndef _CONN_H_ diff --git a/src/syncterm/conn_telnet.c b/src/syncterm/conn_telnet.c index ba6e7e102f47fd840c3c391ac268519e845f70e7..4e4a0430703fe775bd61b7d415cb28a5d1ef4d87 100644 --- a/src/syncterm/conn_telnet.c +++ b/src/syncterm/conn_telnet.c @@ -118,7 +118,7 @@ telnet_connect(struct bbslist *bbs) telnet_log_level = bbs->telnet_loglevel; - rlogin_sock = conn_socket_connect(bbs); + rlogin_sock = conn_socket_connect(bbs, true); if (rlogin_sock == INVALID_SOCKET) return -1; diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c index cba629cecdf0a8d04085c64f089c60ae692ca9f5..bfb0a587d68841c553aeefc09e7b6f2d4f0c4380 100644 --- a/src/syncterm/rlogin.c +++ b/src/syncterm/rlogin.c @@ -109,7 +109,7 @@ rlogin_connect(struct bbslist *bbs) ruser = bbs->password; } - rlogin_sock = conn_socket_connect(bbs); + rlogin_sock = conn_socket_connect(bbs, true); if (rlogin_sock == INVALID_SOCKET) return -1; diff --git a/src/syncterm/ssh.c b/src/syncterm/ssh.c index a2bb9ec7dd1976ac00f113086bd081362d58c218..cfe0ad8a55e340066c7f8d6617efc475bd87f3bd 100644 --- a/src/syncterm/ssh.c +++ b/src/syncterm/ssh.c @@ -784,7 +784,7 @@ ssh_connect(struct bbslist *bbs) ssh_context = -1; } - ssh_sock = conn_socket_connect(bbs); + ssh_sock = conn_socket_connect(bbs, true); if (ssh_sock == INVALID_SOCKET) return -1; diff --git a/src/syncterm/telnets.c b/src/syncterm/telnets.c index 6f354c3f82f647368c92eb394b9be5cc2dc320d6..bafad845010ddae7dfdb481b71e790d4464c203a 100644 --- a/src/syncterm/telnets.c +++ b/src/syncterm/telnets.c @@ -156,7 +156,7 @@ telnets_connect(struct bbslist *bbs) init_uifc(true, true); assert_pthread_mutex_init(&telnets_mutex, NULL); - telnets_sock = conn_socket_connect(bbs); + telnets_sock = conn_socket_connect(bbs, true); if (telnets_sock == INVALID_SOCKET) return -1; diff --git a/src/syncterm/webget.c b/src/syncterm/webget.c index fba7e80ff3f4ff70984c35e302360b0f95feaeed..ea409b090d9953155043b3a5e99e43e46364b1ff 100644 --- a/src/syncterm/webget.c +++ b/src/syncterm/webget.c @@ -11,7 +11,6 @@ #include "sockwrap.h" #include "stdio.h" #include "syncterm.h" -#include "uifcinit.h" #include "webget.h" #include "xpprintf.h" @@ -999,7 +998,7 @@ do_request(struct http_session *sess) if (!parse_uri(sess)) goto error_return; set_state(sess->req, "Connecting"); - sess->sock = conn_socket_connect(&sess->hacky_list_entry); + sess->sock = conn_socket_connect(&sess->hacky_list_entry, false); if (sess->sock == INVALID_SOCKET) { set_msg(sess->req, "Connection Failed"); goto error_return; @@ -1113,6 +1112,7 @@ bool iniReadHttp(struct webget_request *req) { struct http_session sess = { + .sock = INVALID_SOCKET, .req = req, .tls = -1, .hacky_list_entry = { @@ -1193,6 +1193,8 @@ destroy_webget_req(struct webget_request *req) } #if 0 +#include "uifcinit.h" + int main(int argc, char **argv) {