diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c index 9404df3196cfb700f48e5063a2e5d576cf3c5ea6..7d8771cafec97a7b1c1c13e94aa97c425509d5b0 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 );