From 4526bfdee9763fea5f6032d38867c68f63220599 Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Sun, 16 Jun 2002 19:55:30 +0000 Subject: [PATCH] Implemented binkp CRC extension --- ChangeLog | 11 ++++++----- mbcico/binkp.c | 35 +++++++++++++++++++---------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0e9fae74..6ce68c96 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,8 +4,6 @@ $Id$ v0.35.01 05-Jun-2002 -DO NOT USE THIS VERSION, IT WON'T WORK !!!!!! - general: Added structures for netmail routing file. Expanded nodes structures for FTP and Directory transfers. @@ -22,11 +20,14 @@ DO NOT USE THIS VERSION, IT WON'T WORK !!!!!! mbcico: Now uses the new session password field for session handshake. - The binkd version string now includes the OS and CPU type. + The binkp version string now includes the OS and CPU type. If a transmitted file via binkp is skipped by the remote it will stay in the queue for the next session. - The binkp receiver now supports the CRC option. - The binkp transmitter doesn't right now, sessions will fail!!!!! + The binkp protocol now supports the CRC option proposed by + Tobias Ernst. This unofficial extension is also supported by + Irex and patched BinkP versions. + Better error handling for error conditions during a binkp + session. mbfile: Added -v commandline switch to supress virus checking for the diff --git a/mbcico/binkp.c b/mbcico/binkp.c index 199f28f4..5638e4e9 100644 --- a/mbcico/binkp.c +++ b/mbcico/binkp.c @@ -920,7 +920,6 @@ int binkp_batch(file_list *to_send) tcrc = file_crc(tmp->local, FALSE); else tcrc = 0; - Syslog('b', "File CRC is %lx %ld", tcrc, tcrc); txfp = fopen(tmp->local, "r"); if (txfp == NULL) { @@ -1055,18 +1054,19 @@ int binkp_batch(file_list *to_send) case MM_ERR: Syslog('+', "Binkp: got ERR: %s", rxbuf+1); RxState = RxDone; TxState = TxDone; + rc = -10; break; case MM_BSY: Syslog('+', "Binkp: got BSY: %s", rxbuf+1); RxState = RxDone; TxState = TxDone; + rc = -11; break; - case MM_SKIP: Syslog('+', "Got SKIP frame"); - Syslogp('+', printable(rxbuf+1, 0)); + case MM_SKIP: Syslog('+', "Binkp: got SKIP: %s", rxbuf+1); break; - case MM_GET: Syslog('+', "Got GET frame"); + case MM_GET: Syslog('+', "Binkp: got GET: %s", rxbuf+1); sscanf(rxbuf+1, "%s %ld %ld %ld", gname, &gsize, >ime, &goffset); for (tmpg = bll; tmpg; tmpg = tmpg->next) { if (strcasecmp(tmpg->remote, gname) == 0) { @@ -1078,7 +1078,8 @@ int binkp_batch(file_list *to_send) } break; - case MM_GOT: sscanf(rxbuf+1, "%s %ld %ld", lname, &lsize, <ime); + case MM_GOT: Syslog('+', "Binkp: got GOT: %s", rxbuf+1); + sscanf(rxbuf+1, "%s %ld %ld", lname, &lsize, <ime); Found = FALSE; for (tmp = bll; tmp; tmp = tmp->next) if ((strcmp(lname, tmp->remote) == 0) && (lsize == tmp->size) && (ltime == tmp->date)) { @@ -1094,13 +1095,13 @@ int binkp_batch(file_list *to_send) case MM_NUL: b_nul(rxbuf+1); break; - case MM_EOB: Syslog('+', "Binkp: received EOB"); + case MM_EOB: Syslog('+', "Binkp: got EOB"); RxState = RxEndOfBatch; break; - case MM_FILE: if ((RxState == RxWaitFile) || (RxState == RxEndOfBatch)) { + case MM_FILE: Syslog('b', "Binkp: got FILE: %s", rxbuf+1); + if ((RxState == RxWaitFile) || (RxState == RxEndOfBatch)) { RxState = RxAcceptFile; - Syslog('b', "MM_FILE %s", rxbuf+1); if (strlen(rxbuf) < 512) { /* * Check against buffer overflow @@ -1111,7 +1112,6 @@ int binkp_batch(file_list *to_send) } else { sscanf(rxbuf+1, "%s %ld %ld %ld", rname, &rsize, &rtime, &roffs); } - Syslog('b', "Expecting CRC %lx", rcrc); } else { Syslog('+', "Got corrupted FILE frame, size %d bytes", strlen(rxbuf)); } @@ -1134,30 +1134,32 @@ int binkp_batch(file_list *to_send) } rxpos += written; if (rxpos == rsize) { + RxState = RxWaitFile; if (CRCflag && rcrc) { rxcrc = rxcrc ^ 0xffffffff; - Syslog('b', "File received crc %lx, expected %lx", rxcrc, rcrc); if (rcrc == rxcrc) { binkp_send_control(MM_GOT, "%s %ld %ld %lx", rname, rsize, rtime, rcrc); + closefile(TRUE); } else { rxerror = TRUE; crc_errors++; - if (crc_errors < 3) { - binkp_send_control(MM_SKIP, "%s %ld %ld %lx", rname, rsize, rtime, rcrc); - WriteError("File CRC error nr %d, sending SKIP frame", crc_errors); - } else { + binkp_send_control(MM_SKIP, "%s %ld %ld %lx", rname, rsize, rtime, rcrc); + Syslog('+', "File CRC error nr %d, sending SKIP frame", crc_errors); + if (crc_errors >= 3) { WriteError("File CRC error nr %d, aborting session", crc_errors); binkp_send_control(MM_ERR, "Too much CRC errors, aborting session"); RxState = RxDone; + rc = -12; } + closefile(FALSE); } } else { /* * ACK without CRC check */ binkp_send_control(MM_GOT, "%s %ld %ld", rname, rsize, rtime); + closefile(TRUE); } - closefile(TRUE); rxpos = rxpos - rxbytes; gettimeofday(&rxtvend, &tz); Syslog('+', "Binkp: %s %s", rxerror?"ERROR":"OK", transfertime(rxtvstart, rxtvend, rxpos, FALSE)); @@ -1201,6 +1203,7 @@ int binkp_batch(file_list *to_send) binkp_send_control(MM_BSY, "Low diskspace, try again later"); RxState = RxDone; TxState = TxDone; + rc = -13; break; } @@ -1210,7 +1213,7 @@ int binkp_batch(file_list *to_send) * be deleted at the remote. */ Syslog('+', "Binkp: already got %s, sending GOT", rname); - if (CRCflag &rcrc) + if (CRCflag && rcrc) binkp_send_control(MM_GOT, "%s %ld %ld %lx", rname, rsize, rtime, rcrc); else binkp_send_control(MM_GOT, "%s %ld %ld", rname, rsize, rtime);