diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index 1d563878447a03c22dbae353c67a2e4fbae6bffd..971847eb015b1d93f9b4da5970d742be1d6f9695 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -2172,10 +2172,11 @@ void passthru_thread(void* arg) ,sbbs->cfg.node_num, ERROR_VALUE, sbbs->passthru_socket); break; } - if(RingBufFree(&sbbs->outbuf) < sizeof(inbuf) * 2) - continue; + rd = RingBufFree(&sbbs->outbuf); + if(rd > sizeof(inbuf)) + rd = sizeof(inbuf); - rd = recv(sbbs->passthru_socket, inbuf, sizeof(inbuf), 0); + rd = recv(sbbs->passthru_socket, inbuf, rd, 0); if(rd == SOCKET_ERROR) { @@ -2195,8 +2196,13 @@ void passthru_thread(void* arg) if(rd == 0) { - lprintf(LOG_DEBUG,"Node %d passthru disconnected", sbbs->cfg.node_num); - break; + char ch; + if(recv(sbbs->passthru_socket, &ch, sizeof(ch), MSG_PEEK) == 0) { + lprintf(LOG_DEBUG,"Node %d passthru disconnected", sbbs->cfg.node_num); + break; + } + YIELD(); + continue; } if(sbbs->xtrn_mode & EX_BIN) { @@ -2206,8 +2212,10 @@ void passthru_thread(void* arg) if(!(sbbs->telnet_mode&TELNET_MODE_OFF)) rd = telnet_expand((BYTE*)inbuf, rd, telnet_buf, sizeof(telnet_buf), /* expand_cr */false, &bp); - if(!RingBufWrite(&sbbs->outbuf, bp, rd)) { - lprintf(LOG_ERR,"Cannot pass from passthru socket to outbuf"); + DWORD wr = RingBufWrite(&sbbs->outbuf, bp, rd); + if(wr != rd) { + lprintf(LOG_ERR,"Short-write (%ld of %ld bytes) from passthru socket to outbuf" + ,(long)wr, (long)rd); break; } } else {