From e3b7878345fcd3adf8d545cec00fd379c44c2cd2 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Thu, 9 Jun 2005 03:27:49 +0000 Subject: [PATCH] The last subpacket of a ZDATA frame should be ZCRCE, not ZCRCW. --- src/sbbs3/zmodem.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c index 9404df3196..7d8771cafe 100644 --- a/src/sbbs3/zmodem.c +++ b/src/sbbs3/zmodem.c @@ -1376,11 +1376,8 @@ int zmodem_send_from(zmodem_t* zm, FILE* fp, ulong pos, ulong fsize, ulong* sent buf_sent=0; } - /* - * at end of file wait for an ACK - can't use feof() here! - */ - if((ulong)ftell(fp) >= fsize || n==0) - type = ZCRCW; + if((ulong)ftell(fp) >= fsize || n==0) // can't use feof() here! + type = ZCRCE; zmodem_send_data(zm, type, zm->tx_data_subpacket, n); @@ -1389,19 +1386,23 @@ int zmodem_send_from(zmodem_t* zm, FILE* fp, ulong pos, ulong fsize, ulong* sent buf_sent+=n; - if(type == ZCRCW) { /* ZACK expected */ - int type; - lprintf(zm,LOG_DEBUG,"Sent end-of-frame (ZCRCW sub-packet), waiting for ZACK"); - while(is_connected(zm) && !zm->cancelled) { - type = zmodem_recv_header(zm); - if(type != ZACK) - return(type); + if(type == ZCRCW || type == ZCRCE) { + int ack; + lprintf(zm,LOG_DEBUG,"Sent end-of-frame (%s sub-packet)", chr(type)); - if(zm->rxd_header_pos == ftell(fp)) - break; - lprintf(zm,LOG_WARNING,"ZACK for incorrect offset (%lu vs %lu)" - ,zm->rxd_header_pos, ftell(fp)); - } + if(type==ZCRCW) { /* ZACK expected */ + + lprintf(zm,LOG_DEBUG,"Waiting for ZACK"); + while(is_connected(zm) && !zm->cancelled) { + if((ack = zmodem_recv_header(zm)) != ZACK) + return(ack); + + if(zm->rxd_header_pos == ftell(fp)) + break; + lprintf(zm,LOG_WARNING,"ZACK for incorrect offset (%lu vs %lu)" + ,zm->rxd_header_pos, ftell(fp)); + } + } if((ulong)ftell(fp) >= fsize) { lprintf(zm,LOG_DEBUG,"zmodem_send_from: end of file (%ld)", fsize ); -- GitLab