diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c index cd010be2ffd43689caef3448cc4094564e16e539..5a187b5ccec93553e192ab80e0c8da0837cd0c14 100644 --- a/src/syncterm/conn.c +++ b/src/syncterm/conn.c @@ -323,16 +323,14 @@ int conn_connect(struct bbslist *bbs) return(conn_api.terminate); } -BOOL conn_data_waiting(void) +size_t conn_data_waiting(void) { size_t found; pthread_mutex_lock(&(conn_inbuf.mutex)); found=conn_buf_bytes(&conn_inbuf); pthread_mutex_unlock(&(conn_inbuf.mutex)); - if(found) - return(TRUE); - return(FALSE); + return(found); } int conn_close(void) diff --git a/src/syncterm/conn.h b/src/syncterm/conn.h index 979ec528bebd5f408c4f9d7e68a52b0a38f37419..29ca18a27154b7b0974b40bc689b0c93b6d5d0ca 100644 --- a/src/syncterm/conn.h +++ b/src/syncterm/conn.h @@ -60,7 +60,7 @@ int conn_send(char *buffer, size_t buflen, unsigned int timeout); int conn_connect(struct bbslist *bbs); int conn_close(void); BOOL conn_connected(void); -BOOL conn_data_waiting(void); +size_t conn_data_waiting(void); void conn_binary_mode_on(void); void conn_binary_mode_off(void); diff --git a/src/syncterm/term.c b/src/syncterm/term.c index 816f57258f831ccb3325d452191a2f5ad6675821..2fd2febe514607261a258fc71b845224d24ebc73 100644 --- a/src/syncterm/term.c +++ b/src/syncterm/term.c @@ -401,7 +401,7 @@ static int recv_byte(void* unused, unsigned timeout /* seconds */) #endif BOOL data_waiting(void* unused, unsigned timeout) { - return(conn_data_waiting()); + return(conn_data_waiting()!=0); } void draw_transfer_window(char* title) @@ -1181,6 +1181,7 @@ BOOL doterm(struct bbslist *bbs) int updated=FALSE; BOOL sleep; int emulation=CTERM_EMULATION_ANSI_BBS; + size_t remain; speed = bbs->bpsrate; log_level = bbs->xfer_loglevel; @@ -1227,7 +1228,7 @@ BOOL doterm(struct bbslist *bbs) if(!term.nostatus) update_status(bbs, speed); - while(conn_data_waiting() || !conn_connected()) { + for(remain=conn_data_waiting() /* Hack for connection check */ + (!conn_connected()); remain; remain--) { if(!speed || thischar < lastchar /* Wrapped */ || thischar >= nextchar) { /* Get remote input */ inch=recv_byte(NULL, 0); @@ -1271,8 +1272,10 @@ BOOL doterm(struct bbslist *bbs) if(inch == gutsinit[j]) { gutsbuf[j]=inch; gutsbuf[++j]=0; - if(j==sizeof(gutsinit)) /* Have full sequence */ + if(j==sizeof(gutsinit)) { /* Have full sequence */ guts_transfer(bbs); + remain=0; + } } else { gutsbuf[j++]=inch; @@ -1366,6 +1369,7 @@ BOOL doterm(struct bbslist *bbs) else begin_upload(bbs, TRUE); zrqbuf[0]=0; + remain=0; } } else { /* Not a real zrqinit */