diff --git a/src/sbbs3/sexyz.c b/src/sbbs3/sexyz.c index 1b9ef471b1eb84925a72f540a0ada657e835ec63..bb16544b3aade4e6acb16925b7dcf4289b520435 100644 --- a/src/sbbs3/sexyz.c +++ b/src/sbbs3/sexyz.c @@ -704,18 +704,17 @@ void zmodem_progress(void* cbdata, ulong start_pos, ulong current_pos) long t; time_t now; static time_t last_progress; - zmodem_t* zm = (zmodem_t*)cbdata; now=time(NULL); - if(now-last_progress>=progress_interval || current_pos >= zm->current_file_size || newline) { - t=now-zm->transfer_start; + if(now-last_progress>=progress_interval || current_pos >= zm.current_file_size || newline) { + t=now-zm.transfer_start; if(t<=0) t=1; if(start_pos>current_pos) start_pos=0; if((cps=(current_pos-start_pos)/t)==0) cps=1; /* cps so far */ - l=zm->current_file_size/cps; /* total transfer est time */ + l=zm.current_file_size/cps; /* total transfer est time */ l-=t; /* now, it's est time left */ if(l<0) l=0; if(start_pos) @@ -726,13 +725,13 @@ void zmodem_progress(void* cbdata, ulong start_pos, ulong current_pos) "Time: %lu:%02lu/%lu:%02lu CPS: %u %lu%% " ,orig ,current_pos/1024 - ,zm->current_file_size/1024 + ,zm.current_file_size/1024 ,t/60L ,t%60L ,l/60L ,l%60L ,cps - ,(long)(((float)current_pos/(float)zm->current_file_size)*100.0) + ,(long)(((float)current_pos/(float)zm.current_file_size)*100.0) ); newline=FALSE; last_progress=now; @@ -1228,6 +1227,8 @@ static const char* usage= "\n" "opts = -o to overwrite files when receiving\n" " -s disable Zmodem streaming (Slow Zmodem)\n" + " -4 transmit with 4K Zmodem blocks\n" + " -8 transmit with 8K Zmodem blocks (ZedZap)\n" " -! to pause after abnormal exit (error)\n" " -telnet to enable Telnet mode (the default)\n" " -rlogin to enable RLogin (pass-through) mode\n" @@ -1328,6 +1329,7 @@ int main(int argc, char **argv) zm.send_timeout =iniReadInteger(fp,"Zmodem","SendTimeout",zm.send_timeout); /* seconds */ zm.recv_timeout =iniReadInteger(fp,"Zmodem","RecvTimeout",zm.recv_timeout); /* seconds */ + zm.block_size =iniReadInteger(fp,"Zmodem","BlockSize",zm.block_size); /* 1024 or 8192 */ zm.max_errors =iniReadInteger(fp,"Zmodem","MaxErrors",zm.max_errors); zm.escape_telnet_iac =iniReadBool(fp,"Zmodem","EscapeTelnetIAC",TRUE); @@ -1430,6 +1432,12 @@ int main(int argc, char **argv) case 'K': /* sz/rz compatible */ xm.block_size=1024; break; + case '4': + zm.block_size=4096; + break; + case '8': + zm.block_size=8192; + break; case 'S': /* disable Zmodem streaming */ zm.no_streaming=TRUE; break; diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c index 3ecb99830d7ef4bdc5dafbd061fcba44444b8184..7c80cc0bb25bb1563aeb065aedfe7778b23d8b2e 100644 --- a/src/sbbs3/zmodem.c +++ b/src/sbbs3/zmodem.c @@ -1349,7 +1349,10 @@ int zmodem_send_from(zmodem_t* zm, FILE* fp, ulong pos, ulong* sent) /* * read a block from the file */ - n = fread(zm->tx_data_subpacket,1,sizeof(zm->tx_data_subpacket),fp); + if(zm->block_size < 128 || zm->block_size > sizeof(zm->tx_data_subpacket)) + zm->block_size = 1024; /* sanity check block size here */ + + n = fread(zm->tx_data_subpacket,sizeof(BYTE),zm->block_size,fp); #if 0 if(n == 0) { @@ -1398,7 +1401,7 @@ int zmodem_send_from(zmodem_t* zm, FILE* fp, ulong pos, ulong* sent) if((ack = zmodem_recv_header(zm)) != ZACK) return(ack); - if(zm->rxd_header_pos == ftell(fp)) + if(zm->rxd_header_pos == (ulong)ftell(fp)) break; lprintf(zm,LOG_WARNING,"ZACK for incorrect offset (%lu vs %lu)" ,zm->rxd_header_pos, ftell(fp)); @@ -1498,6 +1501,8 @@ BOOL zmodem_send_file(zmodem_t* zm, char* fname, FILE* fp, BOOL request_init, ti } fstat(fileno(fp),&s); + zm->current_file_size = s.st_size; + SAFECOPY(zm->current_file_name, getfname(fname)); /* * the file exists. now build the ZFILE frame @@ -1558,7 +1563,7 @@ BOOL zmodem_send_file(zmodem_t* zm, char* fname, FILE* fp, BOOL request_init, ti p += strlen(p) + 1; sprintf(p,"%lu %lo %lo %d %u %lu %d" - ,(ulong)s.st_size + ,zm->current_file_size ,s.st_mtime ,0 /* file mode */ ,0 /* serial number */ @@ -1627,7 +1632,7 @@ BOOL zmodem_send_file(zmodem_t* zm, char* fname, FILE* fp, BOOL request_init, ti */ if(type == ZRPOS) { - if(zm->rxd_header_pos <= s.st_size) { + if(zm->rxd_header_pos <= zm->current_file_size) { pos = zm->rxd_header_pos; lprintf(zm,LOG_INFO,"Resuming transfer from offset: %lu", pos); } else @@ -1662,10 +1667,10 @@ BOOL zmodem_send_file(zmodem_t* zm, char* fname, FILE* fp, BOOL request_init, ti * and wait for zrinit. if it doesnt come then try again */ - zeof_frame[ZP0] = (uchar) (s.st_size & 0xff); - zeof_frame[ZP1] = (uchar)((s.st_size >> 8) & 0xff); - zeof_frame[ZP2] = (uchar)((s.st_size >> 16) & 0xff); - zeof_frame[ZP3] = (uchar)((s.st_size >> 24) & 0xff); + zeof_frame[ZP0] = (uchar) (zm->current_file_size & 0xff); + zeof_frame[ZP1] = (uchar)((zm->current_file_size >> 8) & 0xff); + zeof_frame[ZP2] = (uchar)((zm->current_file_size >> 16) & 0xff); + zeof_frame[ZP3] = (uchar)((zm->current_file_size >> 24) & 0xff); for(errors=0;errors<=zm->max_errors && !zm->cancelled && is_connected(zm);errors++) { lprintf(zm,LOG_INFO,"Sending End-of-File (ZEOF) frame (%u of %u)" @@ -1931,7 +1936,7 @@ int zmodem_recv_file_frame(zmodem_t* zm, FILE* fp, ulong offset) } while(type != ZDATA); - if(zm->rxd_header_pos==ftell(fp)) + if(zm->rxd_header_pos==(ulong)ftell(fp)) break; lprintf(zm,LOG_WARNING,"Wrong ZDATA block (%lu vs %lu)", zm->rxd_header_pos, ftell(fp)); @@ -1986,8 +1991,8 @@ void zmodem_init(zmodem_t* zm, void* cbdata #if 0 zm->byte_timeout=3; /* seconds */ zm->ack_timeout=10; /* seconds */ - zm->block_size=1024; #endif + zm->block_size=1024; zm->max_errors=9; zm->cbdata=cbdata; diff --git a/src/sbbs3/zmodem.h b/src/sbbs3/zmodem.h index 1866d07cc7c71f3070adaceec518c682e99beda3..30aff326a50fa782f9c3904296cfd63be69cb4f4 100644 --- a/src/sbbs3/zmodem.h +++ b/src/sbbs3/zmodem.h @@ -193,9 +193,9 @@ typedef struct { - BYTE rxd_header[ZMAXHLEN]; /* last received header */ - int rxd_header_len; /* last received header size */ - long rxd_header_pos; /* last received header position value */ + BYTE rxd_header[ZMAXHLEN]; /* last received header */ + int rxd_header_len; /* last received header size */ + ulong rxd_header_pos; /* last received header position value */ /* * receiver capability flags @@ -221,9 +221,7 @@ typedef struct { /* from zmtx.c */ - #define MAX_SUBPACKETSIZE 1024 - - BYTE tx_data_subpacket[MAX_SUBPACKETSIZE]; + BYTE tx_data_subpacket[8192]; BYTE rx_data_subpacket[8192]; /* zzap = 8192 */ char current_file_name[MAX_PATH+1]; @@ -260,6 +258,7 @@ typedef struct { unsigned send_timeout; unsigned recv_timeout; unsigned max_errors; + unsigned block_size; /* Callbacks */ void* cbdata; @@ -283,7 +282,7 @@ void zmodem_init(zmodem_t*, void* cbdata char* zmodem_ver(char *buf); const char* zmodem_source(void); int zmodem_rx(zmodem_t* zm); -int zmodem_tx(zmodem_t* zm, BYTE ch); +int zmodem_tx(zmodem_t* zm, BYTE ch); int zmodem_abort_receive(zmodem_t*); int zmodem_send_ack(zmodem_t*, long pos); int zmodem_send_nak(zmodem_t*);