From 8d3a32a9ccf5de82d26f205924d74ab1873cce76 Mon Sep 17 00:00:00 2001 From: deuce <> Date: Sat, 9 Feb 2008 04:05:09 +0000 Subject: [PATCH] If we did not successfully send a YModem header, and we are using 1K blocks, fall back to 128 byte blocks at the end of the file. Stop using ((block_num-1)*(xm->block_size)) as the offset. Use sent_bytes instead. --- src/sbbs3/xmodem.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/sbbs3/xmodem.c b/src/sbbs3/xmodem.c index 96f4d52905..81dcbf20ee 100644 --- a/src/sbbs3/xmodem.c +++ b/src/sbbs3/xmodem.c @@ -428,6 +428,7 @@ BOOL xmodem_send_file(xmodem_t* xm, const char* fname, FILE* fp, time_t* start, size_t rd; time_t startfile; struct stat st; + BOOL sent_header=FALSE; if(sent!=NULL) *sent=0; @@ -463,8 +464,10 @@ BOOL xmodem_send_file(xmodem_t* xm, const char* fname, FILE* fp, time_t* start, block_len=strlen(block)+1+i; for(xm->errors=0;xm->errors<=xm->max_errors && !is_cancelled(xm) && is_connected(xm);xm->errors++) { xmodem_put_block(xm, block, block_len <=128 ? 128:1024, 0 /* block_num */); - if(xmodem_get_ack(xm,1,0)) + if(xmodem_get_ack(xm,1,0)) { + sent_header=TRUE; break; + } } if(xm->errors>=xm->max_errors || is_cancelled(xm)) { lprintf(xm,LOG_ERR,"Failed to send header block"); @@ -485,10 +488,18 @@ BOOL xmodem_send_file(xmodem_t* xm, const char* fname, FILE* fp, time_t* start, && is_connected(xm)) { fseek(fp,sent_bytes,SEEK_SET); memset(block,CPMEOF,xm->block_size); + if(!sent_header) { + if(xm->block_size>128) { + if((sent_bytes+xm->block_size) > st.st_size) { + lprintf(xm,LOG_INFO,"Falling back to 128 byte blocks for end of file"); + xm->block_size=128; + } + } + } if((rd=fread(block,1,xm->block_size,fp))!=xm->block_size - && (long)(block_num*xm->block_size) < st.st_size) { + && (long)(sent_bytes + xm->block_size) <= st.st_size) { lprintf(xm,LOG_ERR,"READ ERROR %d instead of %d at offset %lu" - ,rd,xm->block_size,(block_num-1)*(long)xm->block_size); + ,rd,xm->block_size,sent_bytes); xm->errors++; continue; } -- GitLab