Skip to content
Snippets Groups Projects
Commit 8e3c4bf7 authored by rswindell's avatar rswindell
Browse files

Fixed Zmodem uploads using CRC-32, ZFIN send/get and other stuff.

parent bc4a9e3c
No related branches found
No related tags found
No related merge requests found
...@@ -193,6 +193,14 @@ static char *chr(uchar ch) ...@@ -193,6 +193,14 @@ static char *chr(uchar ch)
case ZRINIT: return("ZRINIT"); case ZRINIT: return("ZRINIT");
case ZSINIT: return("ZSINIT"); case ZSINIT: return("ZSINIT");
case ZACK: return("ZACK"); case ZACK: return("ZACK");
case ZFILE: return("ZFILE");
case ZSKIP: return("ZSKIP");
case ZNAK: return("ZNAK");
case ZABORT: return("ZABORT");
case ZFIN: return("ZFIN");
case ZRPOS: return("ZRPOS");
case ZDATA: return("ZDATA");
case ZEOF: return("ZEOF");
case ZPAD: return("ZPAD"); case ZPAD: return("ZPAD");
case ZDLE: return("ZDLE"); case ZDLE: return("ZDLE");
case ZDLEE: return("ZDLEE"); case ZDLEE: return("ZDLEE");
...@@ -205,6 +213,10 @@ static char *chr(uchar ch) ...@@ -205,6 +213,10 @@ static char *chr(uchar ch)
case ZVBIN32: return("ZVBIN32"); case ZVBIN32: return("ZVBIN32");
case ZVBINR32: return("ZVBINR32"); case ZVBINR32: return("ZVBINR32");
case ZRESC: return("ZRESC"); case ZRESC: return("ZRESC");
case ZCRCE: return("ZCRCE");
case ZCRCG: return("ZCRCG");
case ZCRCQ: return("ZCRCQ");
case ZCRCW: return("ZCRCW");
} }
} else { } else {
switch(ch) { switch(ch) {
...@@ -795,7 +807,7 @@ static int send_files(char** fname, uint fnames) ...@@ -795,7 +807,7 @@ static int send_files(char** fname, uint fnames)
if(mode&XMODEM) if(mode&XMODEM)
return(0); return(0);
if(mode&ZMODEM) if(mode&ZMODEM)
zmodem_send_zfin(&zm); zmodem_get_zfin(&zm);
else { /* YMODEM */ else { /* YMODEM */
if(xmodem_get_mode(&xm)) { if(xmodem_get_mode(&xm)) {
...@@ -917,7 +929,7 @@ static int receive_files(char** fname_list, int fnames) ...@@ -917,7 +929,7 @@ static int receive_files(char** fname_list, int fnames)
zmodem_send_nak(&zm); zmodem_send_nak(&zm);
break; break;
case ZFIN: case ZFIN:
zmodem_send_zfin(&zm); zmodem_send_zfin(&zm); /* ACK */
/* fall-through */ /* fall-through */
case ZCOMPL: case ZCOMPL:
return(0); return(0);
...@@ -1006,7 +1018,7 @@ static int receive_files(char** fname_list, int fnames) ...@@ -1006,7 +1018,7 @@ static int receive_files(char** fname_list, int fnames)
,str ,str
,file_bytes/1024 ,file_bytes/1024
,mode&YMODEM ? mode&GMODE ? "Ymodem-G" : "Ymodem" :"Zmodem" ,mode&YMODEM ? mode&GMODE ? "Ymodem-G" : "Ymodem" :"Zmodem"
,mode&CRC ? "CRC-16" : "Checksum"); ,mode&ZMODEM ? "" : (mode&CRC ? "CRC-16" : "Checksum"));
startfile=time(NULL); startfile=time(NULL);
success=FALSE; success=FALSE;
......
...@@ -261,7 +261,7 @@ zmodem_tx_hex_header(zmodem_t* zm, unsigned char * p) ...@@ -261,7 +261,7 @@ zmodem_tx_hex_header(zmodem_t* zm, unsigned char * p)
*/ */
zmodem_tx_raw(zm, '\r'); zmodem_tx_raw(zm, '\r');
zmodem_tx_raw(zm, '\n'); zmodem_tx_raw(zm, '\n'|0x80); /* FDSZ sends 0x8a instead of 0x0a */
if(type!=ZACK && type!=ZFIN) if(type!=ZACK && type!=ZFIN)
zmodem_tx_raw(zm, XON); zmodem_tx_raw(zm, XON);
...@@ -431,6 +431,13 @@ zmodem_tx_16_data(zmodem_t* zm, uchar sub_frame_type,unsigned char * p,int l) ...@@ -431,6 +431,13 @@ zmodem_tx_16_data(zmodem_t* zm, uchar sub_frame_type,unsigned char * p,int l)
void void
zmodem_tx_data(zmodem_t* zm, uchar sub_frame_type,unsigned char * p, int l) zmodem_tx_data(zmodem_t* zm, uchar sub_frame_type,unsigned char * p, int l)
{ {
#if 0
int i;
for(i=0;i<l;i++)
fprintf(stderr,"%02X ",p[i]);
fprintf(stderr,"\n");
#endif
if(!zm->want_fcs_16 && zm->can_fcs_32) { if(!zm->want_fcs_16 && zm->can_fcs_32) {
zmodem_tx_32_data(zm, sub_frame_type,p,l); zmodem_tx_32_data(zm, sub_frame_type,p,l);
} }
...@@ -602,7 +609,7 @@ zmodem_rx(zmodem_t* zm, int to) ...@@ -602,7 +609,7 @@ zmodem_rx(zmodem_t* zm, int to)
case ZCRCG: case ZCRCG:
case ZCRCQ: case ZCRCQ:
case ZCRCW: case ZCRCW:
lprintf(zm,LOG_DEBUG,"escaping data subpacket type: %s", chr((uchar)c)); // lprintf(zm,LOG_DEBUG,"escaping data subpacket type: %s", chr((uchar)c));
return (c | ZDLEESC); return (c | ZDLEESC);
case ZRUB0: case ZRUB0:
return 0x7f; return 0x7f;
...@@ -664,7 +671,7 @@ zmodem_rx_32_data(zmodem_t* zm, unsigned char * p, unsigned maxlen, unsigned* l) ...@@ -664,7 +671,7 @@ zmodem_rx_32_data(zmodem_t* zm, unsigned char * p, unsigned maxlen, unsigned* l)
crc = 0xffffffffl; crc = 0xffffffffl;
do { do {
c = zmodem_rx(zm, 1); c = zmodem_rx(zm, zm->recv_timeout);
if(c == TIMEOUT) { if(c == TIMEOUT) {
return TIMEOUT; return TIMEOUT;
...@@ -683,13 +690,14 @@ zmodem_rx_32_data(zmodem_t* zm, unsigned char * p, unsigned maxlen, unsigned* l) ...@@ -683,13 +690,14 @@ zmodem_rx_32_data(zmodem_t* zm, unsigned char * p, unsigned maxlen, unsigned* l)
crc = ~crc; crc = ~crc;
rxd_crc = zmodem_rx(zm, 1); rxd_crc = zmodem_rx(zm, zm->recv_timeout);
rxd_crc |= zmodem_rx(zm, 1) << 8; rxd_crc |= zmodem_rx(zm, zm->recv_timeout) << 8;
rxd_crc |= zmodem_rx(zm, 1) << 16; rxd_crc |= zmodem_rx(zm, zm->recv_timeout) << 16;
rxd_crc |= zmodem_rx(zm, 1) << 24; rxd_crc |= zmodem_rx(zm, zm->recv_timeout) << 24;
if(rxd_crc != crc) { if(rxd_crc != crc) {
lprintf(zm,LOG_WARNING,"CRC-32 ERROR"); lprintf(zm,LOG_WARNING,"CRC-32 ERROR (%08lX vs %08lX) Bytes=%u"
,rxd_crc, crc, *l);
return FALSE; return FALSE;
} }
...@@ -782,31 +790,28 @@ zmodem_rx_data(zmodem_t* zm, unsigned char* p, size_t maxlen, unsigned* l) ...@@ -782,31 +790,28 @@ zmodem_rx_data(zmodem_t* zm, unsigned char* p, size_t maxlen, unsigned* l)
* frame continues non-stop * frame continues non-stop
*/ */
case ZCRCG: case ZCRCG:
lprintf(zm,LOG_DEBUG,"ZCRCG");
return FRAMEOK; return FRAMEOK;
/* /*
* frame ends * frame ends
*/ */
case ZCRCE: case ZCRCE:
lprintf(zm,LOG_DEBUG,"ZCRCE");
return ENDOFFRAME; return ENDOFFRAME;
/* /*
* frame continues; ZACK expected * frame continues; ZACK expected
*/ */
case ZCRCQ: case ZCRCQ:
lprintf(zm,LOG_DEBUG,"ZCRCQ");
zmodem_send_pos_header(zm, ZACK, pos, /* Hex? */ TRUE); zmodem_send_pos_header(zm, ZACK, pos, /* Hex? */ TRUE);
return FRAMEOK; return FRAMEOK;
/* /*
* frame ends; ZACK expected * frame ends; ZACK expected
*/ */
case ZCRCW: case ZCRCW:
lprintf(zm,LOG_DEBUG,"ZCRCW");
zmodem_send_pos_header(zm, ZACK, pos, /* Hex? */ TRUE); zmodem_send_pos_header(zm, ZACK, pos, /* Hex? */ TRUE);
return ENDOFFRAME; return ENDOFFRAME;
} }
lprintf(zm,LOG_WARNING,"Invalid sub-frame type: %s",chr((uchar)sub_frame_type)); if(sub_frame_type!=FALSE)
lprintf(zm,LOG_WARNING,"Invalid sub-frame type: %s",chr((uchar)sub_frame_type));
return FALSE; return FALSE;
} }
...@@ -894,7 +899,7 @@ zmodem_rx_bin16_header(zmodem_t* zm, int to) ...@@ -894,7 +899,7 @@ zmodem_rx_bin16_header(zmodem_t* zm, int to)
crc = 0; crc = 0;
for (n=0;n<5;n++) { for (n=0;n<HDRLEN;n++) {
c = zmodem_rx(zm, to); c = zmodem_rx(zm, to);
if(c == TIMEOUT) { if(c == TIMEOUT) {
lprintf(zm,LOG_ERR,"timeout"); lprintf(zm,LOG_ERR,"timeout");
...@@ -907,8 +912,8 @@ zmodem_rx_bin16_header(zmodem_t* zm, int to) ...@@ -907,8 +912,8 @@ zmodem_rx_bin16_header(zmodem_t* zm, int to)
// crc = ucrc16(0,crc); // crc = ucrc16(0,crc);
// crc = ucrc16(0,crc); // crc = ucrc16(0,crc);
rxd_crc = zmodem_rx(zm, 1) << 8; rxd_crc = zmodem_rx(zm, zm->recv_timeout) << 8;
rxd_crc |= zmodem_rx(zm, 1); rxd_crc |= zmodem_rx(zm, zm->recv_timeout);
if(rxd_crc != crc) { if(rxd_crc != crc) {
lprintf(zm,LOG_ERR,"bad crc %4.4x %4.4x",rxd_crc,crc); lprintf(zm,LOG_ERR,"bad crc %4.4x %4.4x",rxd_crc,crc);
...@@ -929,7 +934,7 @@ zmodem_rx_hex_header(zmodem_t* zm, int to) ...@@ -929,7 +934,7 @@ zmodem_rx_hex_header(zmodem_t* zm, int to)
#if 0 /* def _DEBUG */ #if 0 /* def _DEBUG */
lprintf(zm,LOG_INFO,"rx_hex_header : "); lprintf(zm,LOG_INFO,"rx_hex_header : ");
#endif #endif
for (i=0;i<5;i++) { for (i=0;i<HDRLEN;i++) {
c = zmodem_rx_hex(zm, to); c = zmodem_rx_hex(zm, to);
if(c == TIMEOUT) { if(c == TIMEOUT) {
return; return;
...@@ -995,8 +1000,8 @@ zmodem_rx_bin32_header(zmodem_t* zm, int to) ...@@ -995,8 +1000,8 @@ zmodem_rx_bin32_header(zmodem_t* zm, int to)
crc = 0xffffffffL; crc = 0xffffffffL;
for (n=0;n<to;n++) { for (n=0;n<HDRLEN;n++) {
c = zmodem_rx(zm, 1); c = zmodem_rx(zm, zm->recv_timeout);
if(c == TIMEOUT) { if(c == TIMEOUT) {
return; return;
} }
...@@ -1006,10 +1011,10 @@ zmodem_rx_bin32_header(zmodem_t* zm, int to) ...@@ -1006,10 +1011,10 @@ zmodem_rx_bin32_header(zmodem_t* zm, int to)
crc = ~crc; crc = ~crc;
rxd_crc = zmodem_rx(zm, 1); rxd_crc = zmodem_rx(zm, zm->recv_timeout);
rxd_crc |= zmodem_rx(zm, 1) << 8; rxd_crc |= zmodem_rx(zm, zm->recv_timeout) << 8;
rxd_crc |= zmodem_rx(zm, 1) << 16; rxd_crc |= zmodem_rx(zm, zm->recv_timeout) << 16;
rxd_crc |= zmodem_rx(zm, 1) << 24; rxd_crc |= zmodem_rx(zm, zm->recv_timeout) << 24;
if(rxd_crc != crc) { if(rxd_crc != crc) {
return; return;
...@@ -1118,8 +1123,8 @@ zmodem_rx_header_raw(zmodem_t* zm, int to, int errors) ...@@ -1118,8 +1123,8 @@ zmodem_rx_header_raw(zmodem_t* zm, int to, int errors)
zm->ack_file_pos = 0l; zm->ack_file_pos = 0l;
} }
#if 0 /* def _DEBUG */ #if 0 //def _DEBUG
lprintf(zm,LOG_INFO,"type %d",zm->rxd_header[0]); lprintf(zm,LOG_DEBUG,"zmodem_rx_header_raw received header type: %s",chr(zm->rxd_header[0]));
#endif #endif
return zm->rxd_header[0]; return zm->rxd_header[0];
...@@ -1129,9 +1134,12 @@ int ...@@ -1129,9 +1134,12 @@ int
zmodem_rx_header(zmodem_t* zm, int timeout) zmodem_rx_header(zmodem_t* zm, int timeout)
{ {
int ret = zmodem_rx_header_raw(zm, timeout, FALSE); int ret = zmodem_rx_header_raw(zm, timeout, FALSE);
if(ret != TIMEOUT) #if 0
lprintf(zm,LOG_INFO,"zmodem_rx_header returning %s", chr((uchar)ret)); if(ret == TIMEOUT)
lprintf(zm,LOG_WARNING,"zmodem_rx_header timeout");
else
lprintf(zm,LOG_INFO,"zmodem_rx_header returning: %s", chr((uchar)ret));
#endif
if(ret==ZCAN) if(ret==ZCAN)
zm->cancelled=TRUE; zm->cancelled=TRUE;
...@@ -1185,7 +1193,9 @@ int zmodem_get_zrinit(zmodem_t* zm) ...@@ -1185,7 +1193,9 @@ int zmodem_get_zrinit(zmodem_t* zm)
void zmodem_send_zrinit(zmodem_t* zm) void zmodem_send_zrinit(zmodem_t* zm)
{ {
unsigned char zrinit_header[] = { ZRINIT, 0, 0, 0, ZF0_CANFDX | ZF0_CANOVIO | ZF0_CANFC32 }; unsigned char zrinit_header[] = { ZRINIT, 0, 0, 0, 0 };
zrinit_header[ZF0] = ZF0_CANBRK | ZF0_CANFDX | ZF0_CANOVIO | ZF0_CANFC32;
#if 0 #if 0
zrinit_header[ZP0] = sizeof(zm->rx_data_subpacket) >> 8; zrinit_header[ZP0] = sizeof(zm->rx_data_subpacket) >> 8;
...@@ -1200,12 +1210,18 @@ void zmodem_send_nak(zmodem_t* zm) ...@@ -1200,12 +1210,18 @@ void zmodem_send_nak(zmodem_t* zm)
zmodem_send_pos_header(zm, ZNAK, 0, /* Hex? */ TRUE); zmodem_send_pos_header(zm, ZNAK, 0, /* Hex? */ TRUE);
} }
int zmodem_send_zfin(zmodem_t* zm) void zmodem_send_zfin(zmodem_t* zm)
{ {
int type;
unsigned char zfin_header[] = { ZFIN, 0, 0, 0, 0 }; unsigned char zfin_header[] = { ZFIN, 0, 0, 0, 0 };
zmodem_tx_hex_header(zm,zfin_header); zmodem_tx_hex_header(zm,zfin_header);
}
int zmodem_get_zfin(zmodem_t* zm)
{
int type;
zmodem_send_zfin(zm);
do { do {
type = zmodem_rx_header(zm,zm->recv_timeout); type = zmodem_rx_header(zm,zm->recv_timeout);
} while (type != ZFIN && type != TIMEOUT); } while (type != ZFIN && type != TIMEOUT);
...@@ -1302,10 +1318,10 @@ zmodem_send_from(zmodem_t* zm, FILE* fp, ulong pos, ulong fsize, ulong* sent) ...@@ -1302,10 +1318,10 @@ zmodem_send_from(zmodem_t* zm, FILE* fp, ulong pos, ulong fsize, ulong* sent)
while (zmodem_rx_poll(zm)) { while (zmodem_rx_poll(zm)) {
int type; int type;
int c; int c;
if((c = zmodem_rx_raw(zm, 1)) < 0) if((c = zmodem_rx_raw(zm, zm->send_timeout)) < 0)
return(c); return(c);
if(c == ZPAD) { if(c == ZPAD) {
type = zmodem_rx_header(zm, 1); type = zmodem_rx_header(zm, zm->send_timeout);
if(type != TIMEOUT && type != ACK) { if(type != TIMEOUT && type != ACK) {
return type; return type;
} }
...@@ -1447,6 +1463,9 @@ BOOL zmodem_send_file(zmodem_t* zm, char* fname, FILE* fp, BOOL request_init, ti ...@@ -1447,6 +1463,9 @@ BOOL zmodem_send_file(zmodem_t* zm, char* fname, FILE* fp, BOOL request_init, ti
* send the header and the data * send the header and the data
*/ */
lprintf(zm,LOG_INFO,"Sending ZFILE header block: '%s'"
,zm->tx_data_subpacket+strlen(zm->tx_data_subpacket)+1);
zmodem_tx_header(zm,zfile_frame); zmodem_tx_header(zm,zfile_frame);
zmodem_tx_data(zm,ZCRCW,zm->tx_data_subpacket,p - zm->tx_data_subpacket); zmodem_tx_data(zm,ZCRCW,zm->tx_data_subpacket,p - zm->tx_data_subpacket);
...@@ -1660,8 +1679,11 @@ int zmodem_recv_init(zmodem_t* zm) ...@@ -1660,8 +1679,11 @@ int zmodem_recv_init(zmodem_t* zm)
type = zmodem_rx_header(zm, zm->recv_timeout); type = zmodem_rx_header(zm, zm->recv_timeout);
if(type!=TIMEOUT && type!=ZRQINIT) if(type!=TIMEOUT && type!=ZRQINIT)
break; break;
if(type!=TIMEOUT) if(type!=TIMEOUT) {
lprintf(zm,LOG_WARNING,"Received header type: %s, expected ZFILE", chr((uchar)type)); lprintf(zm,LOG_WARNING,"Received header type: %s, expected ZFILE", chr((uchar)type));
lprintf(zm,LOG_DEBUG,"ZF0=%02X ZF1=%02X ZF2=%02X ZF3=%02X"
,zm->rxd_header[ZF0],zm->rxd_header[ZF1],zm->rxd_header[ZF2],zm->rxd_header[ZF3]);
}
} }
return(type); return(type);
...@@ -1686,6 +1708,7 @@ BOOL zmodem_recv_file_info(zmodem_t* zm ...@@ -1686,6 +1708,7 @@ BOOL zmodem_recv_file_info(zmodem_t* zm
long serial=-1; long serial=-1;
unsigned l; unsigned l;
memset(block,0,sizeof(block));
i=zmodem_rx_data(zm, block, sizeof(block), &l); i=zmodem_rx_data(zm, block, sizeof(block), &l);
if(i!=FRAMEOK && i!=ENDOFFRAME) if(i!=FRAMEOK && i!=ENDOFFRAME)
...@@ -1731,7 +1754,7 @@ unsigned zmodem_recv_file_data(zmodem_t* zm, FILE* fp, ulong offset, ulong fsize ...@@ -1731,7 +1754,7 @@ unsigned zmodem_recv_file_data(zmodem_t* zm, FILE* fp, ulong offset, ulong fsize
if((i = zmodem_recv_file_frame(zm,fp,offset,fsize,start)) == ZEOF) if((i = zmodem_recv_file_frame(zm,fp,offset,fsize,start)) == ZEOF)
break; break;
if(i!=ENDOFFRAME) { if(i!=ENDOFFRAME) {
if(i>=0) if(i>0)
lprintf(zm,LOG_WARNING,"Error at byte %lu: %s", ftell(fp), chr((uchar)i)); lprintf(zm,LOG_WARNING,"Error at byte %lu: %s", ftell(fp), chr((uchar)i));
errors++; errors++;
} }
......
...@@ -276,8 +276,9 @@ void zmodem_send_zskip(zmodem_t* zm); ...@@ -276,8 +276,9 @@ void zmodem_send_zskip(zmodem_t* zm);
void zmodem_send_zrinit(zmodem_t*); void zmodem_send_zrinit(zmodem_t*);
void zmodem_send_pos_header(zmodem_t* zm, int type, long pos, BOOL hex); void zmodem_send_pos_header(zmodem_t* zm, int type, long pos, BOOL hex);
int zmodem_get_zrinit(zmodem_t*); int zmodem_get_zrinit(zmodem_t*);
int zmodem_get_zfin(zmodem_t* zm);
void zmodem_parse_zrinit(zmodem_t*); void zmodem_parse_zrinit(zmodem_t*);
int zmodem_send_zfin(zmodem_t*); void zmodem_send_zfin(zmodem_t*);
BOOL zmodem_send_file(zmodem_t*, char* name, FILE* fp, BOOL request_init, time_t* start, ulong* bytes_sent); BOOL zmodem_send_file(zmodem_t*, char* name, FILE* fp, BOOL request_init, time_t* start, ulong* bytes_sent);
int zmodem_recv_init(zmodem_t* zm); int zmodem_recv_init(zmodem_t* zm);
BOOL zmodem_recv_file_info(zmodem_t* zm BOOL zmodem_recv_file_info(zmodem_t* zm
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment