From 60a62b28cceff0969eab35cef331572d2ea69516 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Wed, 26 Jan 2005 11:44:31 +0000 Subject: [PATCH] Removed references to variable headers (not supported). Added/enabled some more debug output. Beginning of support for non-streaming sends (not working yet). Enable non-streaming sends when buffer size (or !CANOVIO) in ZRINIT header. --- src/sbbs3/zmodem.c | 33 +++++++++++++++++++++++---------- src/sbbs3/zmodem.h | 2 -- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c index 5bbaf70e6d..2f41abf19b 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 3e248936b6..56360b866e 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 -- GitLab