diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c index 5bbaf70e6d92c400ed229e2b8594e6b393493d3f..2f41abf19bc8798da8649406fdc7bcbc9b02ddfc 100644 --- a/src/sbbs3/zmodem.c +++ b/src/sbbs3/zmodem.c @@ -782,10 +782,13 @@ zmodem_rx_data(zmodem_t* zm, unsigned char* p, size_t maxlen, unsigned* l) else { sub_frame_type = zmodem_rx_16_data(zm, p, maxlen, l); } + + if(sub_frame_type==TIMEOUT) + return(TIMEOUT); + + lprintf(zm,LOG_DEBUG,"received sub-frame type: %s",chr((uchar)sub_frame_type)); switch (sub_frame_type) { - case TIMEOUT: - return TIMEOUT; /* * frame continues non-stop */ @@ -1134,7 +1137,7 @@ int zmodem_rx_header(zmodem_t* zm, int timeout) { int ret = zmodem_rx_header_raw(zm, timeout, FALSE); -#if 0 +#if 1 if(ret == TIMEOUT) lprintf(zm,LOG_WARNING,"zmodem_rx_header timeout"); else @@ -1165,18 +1168,31 @@ zmodem_rx_header_and_check(zmodem_t* zm, int timeout) void zmodem_parse_zrinit(zmodem_t* zm) { + ushort buf_size; + zm->can_full_duplex = (zm->rxd_header[ZF0] & ZF0_CANFDX) != 0; zm->can_overlap_io = (zm->rxd_header[ZF0] & ZF0_CANOVIO) != 0; zm->can_break = (zm->rxd_header[ZF0] & ZF0_CANBRK) != 0; zm->can_fcs_32 = (zm->rxd_header[ZF0] & ZF0_CANFC32) != 0; zm->escape_all_control_characters = (zm->rxd_header[ZF0] & ZF0_ESCCTL) != 0; zm->escape_8th_bit = (zm->rxd_header[ZF0] & ZF0_ESC8) != 0; - zm->use_variable_headers = (zm->rxd_header[ZF1] & ZF1_CANVHDR) != 0; - lprintf(zm,LOG_INFO,"Receiver requested mode: CRC-%u, Escape: %s, %s Headers" + lprintf(zm,LOG_INFO,"Receiver requested mode (0x%02X):\r\n" + "%s-duplex, %s overlap I/O, CRC-%u, Escape: %s" + ,zm->rxd_header[ZF0] + ,zm->can_full_duplex ? "Full" : "Half" + ,zm->can_overlap_io ? "Can" : "Cannot" ,zm->can_fcs_32 ? 32 : 16 ,zm->escape_all_control_characters ? "ALL" : "Normal" - ,zm->use_variable_headers ? "Variable" : "Fixed"); + ); + + if(!zm->can_overlap_io) + zm->no_streaming = TRUE; + + if((buf_size = (zm->rxd_header[ZP0]<<8 | zm->rxd_header[ZP1])) != 0) { + lprintf(zm,LOG_INFO,"Receiver specified buffer size of: %u", buf_size); + zm->no_streaming = TRUE; + } } int zmodem_get_zrinit(zmodem_t* zm) @@ -1284,7 +1300,7 @@ zmodem_send_from(zmodem_t* zm, FILE* fp, ulong pos, ulong fsize, ulong* sent) /* * at end of file wait for an ACK */ - if((ulong)ftell(fp) == fsize) { + if(zm->no_streaming || (ulong)ftell(fp) == fsize) { type = ZCRCW; } @@ -1598,8 +1614,6 @@ zmodem_send_files(char** fname, int total_files) zmodem_escape_all_control_characters = (zm->rxd_header[ZF0] & ZF0_ESCCTL) != 0; zmodem_escape_8th_bit = (zm->rxd_header[ZF0] & ZF0_ESC8) != 0; - zm->use_variable_headers = (zm->rxd_header[ZF1] & ZF1_CANVHDR) != 0; - if(*(zm->mode)&DEBUG) { lprintf(zm,LOG_INFO,"receiver %s full duplex" ,zmodem_can_full_duplex ? "can" : "can't"); lprintf(zm,LOG_INFO,"receiver %s overlap io" ,zmodem_can_overlap_io ? "can" : "can't"); @@ -1607,7 +1621,6 @@ zmodem_send_files(char** fname, int total_files) lprintf(zm,LOG_INFO,"receiver %s fcs 32" ,zmodem_can_fcs_32 ? "can" : "can't"); lprintf(zm,LOG_INFO,"receiver %s escaped control chars",zmodem_escape_all_control_characters ? "requests" : "doesn't request"); lprintf(zm,LOG_INFO,"receiver %s escaped 8th bit" ,zmodem_escape_8th_bit ? "requests" : "doesn't request"); - lprintf(zm,LOG_INFO,"receiver %s use variable headers" ,zm->use_variable_headers ? "can" : "can't"); } /* diff --git a/src/sbbs3/zmodem.h b/src/sbbs3/zmodem.h index 3e248936b6f4057fae9007c9b381f59beb11d7a1..56360b866ecb3a2530f6566cae20754ccd49ce23 100644 --- a/src/sbbs3/zmodem.h +++ b/src/sbbs3/zmodem.h @@ -209,8 +209,6 @@ typedef struct { int escape_all_control_characters; /* guess */ int escape_8th_bit; - int use_variable_headers; /* use variable length headers */ - /* * file management options. * only one should be on