diff --git a/ChangeLog b/ChangeLog index 8ef0f5cc..d6b5e61d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,22 @@ $Id$ -v0.83.10 25-Jan-2006 +v0.83.11 28-Jan-2006 + + +v0.83.10 25-Jan-2006 - 28-Jan-2006 + + upgrade: + In menus 7.n.3.14 check if the NR flag is off, unless you need + it (which I doubt). + + mbcico: + Implemented binkp NR option. We don't really make use of it, + but if the remote mailer whishes to send files in NR mode it + will work. + + mbsetup: + Added NR switch to the nodes session setup. + v0.83.9 23-Jan-2006 - 25-Jan-2006 diff --git a/TODO b/TODO index 3eb914d9..02c9df83 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,6 @@ $Id$ - MBSE BBS V0.83.10 TODO list. + MBSE BBS V0.83.11 TODO list. ---------------------------- These are a list of things that must be implemented one way or @@ -92,8 +92,6 @@ mbfido: W: Someday make retoss from bad possible (volonteers?). mbcico: - N: Implement binkp option NR. - L: Implement binkp option ND and NDA. mbmsg: diff --git a/mbcico/binkp.c b/mbcico/binkp.c index 66490d84..85b05e2c 100644 --- a/mbcico/binkp.c +++ b/mbcico/binkp.c @@ -5,7 +5,7 @@ * Binkp protocol copyright : Dima Maloff. * ***************************************************************************** - * Copyright (C) 1997-2005 + * Copyright (C) 1997-2006 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -95,7 +95,7 @@ typedef enum {CompNone, CompGZ, CompBZ2, CompPLZ} CompType; static char *rxstate[] = { (char *)"RxWaitF", (char *)"RxAccF", (char *)"RxReceD", (char *)"RxWriteD", (char *)"RxEOB", (char *)"RxDone" }; #if defined(HAVE_ZLIB_H) || defined(HAVE_BZLIB_H) -static char *opstate[] = { (char *)"No", (char *)"Can", (char *)"Want", (char *)"Active" }; +static char *opstate[] = { (char *)"No ", (char *)"Can ", (char *)"Want", (char *)"Act." }; #endif static char *cpstate[] = { (char *)"No", (char *)"GZ", (char *)"BZ2", (char *)"PLZ" }; @@ -225,7 +225,7 @@ int binkp_send_command(int, ...); /* Send command frame */ void binkp_settimer(int); /* Set timeout timer */ int binkp_expired(void); /* Timer expired? */ int binkp_banner(int); /* Send system banner */ -int binkp_send_comp_opts(void); /* Send compression options */ +int binkp_send_comp_opts(int); /* Send compression options */ void binkp_set_comp_state(void); /* Set compression state */ int binkp_recv_command(char *, unsigned int *, int *); /* Receive command frame */ void parse_m_nul(char *); /* Parse M_NUL message */ @@ -297,8 +297,11 @@ int binkp(int role) } #endif bp.buggyIrex = FALSE; - bp.NRwe = No; - bp.NRthey = No; + if (localoptions & NONR) + bp.NRwe = Can; + else + bp.NRwe = Want; + bp.NRthey = Can; bp.NDwe = No; bp.NDthey = No; bp.NDAwe = No; @@ -924,7 +927,7 @@ SM_STATE(Opts) } #endif - binkp_send_comp_opts(); + binkp_send_comp_opts(FALSE); binkp_set_comp_state(); SM_SUCCESS; @@ -1048,7 +1051,7 @@ TrType binkp_receiver(void) char zbuf[ZBLKSIZE]; char *buf = bp.rxbuf; -// Syslog('b', "Binkp: receiver %s", rxstate[bp.RxState]); + Syslog('b', "Binkp: receiver %s", rxstate[bp.RxState]); if (bp.RxState == RxWaitF) { @@ -1145,8 +1148,24 @@ TrType binkp_receiver(void) else return Ok; } - Syslog('+', "Binkp: receive file \"%s\" date %s size %ld offset %ld comp %s", + + Syslog('+', "Binkp: receive file \"%s\" date %s size %ld offset %ld comp %s", bp.rname, date(bp.rtime), bp.rsize, bp.roffs, cpstate[bp.rmode]); + if (bp.roffs == -1) { + /* + * Even without NR mode Taurus sends as if it's in NR mode. + */ + if ((bp.NRwe != Active) && (bp.NRthey != Active)) { + Syslog('b', "Binkp: detected Taurus bug, start workaround"); + } + bp.roffs = 0; + rc = binkp_send_command(MM_GET, "%s %ld %ld %ld", bp.rname, bp.rsize, bp.rtime, bp.roffs); + bp.RxState = RxWaitF; + if (rc) + return Failure; + else + return Ok; + } (void)binkp2unix(bp.rname); rxbytes = bp.rxbytes; @@ -1975,7 +1994,7 @@ int binkp_banner(int originate) */ if (originate) { if (!rc) { - rc = binkp_send_comp_opts(); + rc = binkp_send_comp_opts(TRUE); } } @@ -1987,9 +2006,9 @@ int binkp_banner(int originate) /* * Send compression options */ -int binkp_send_comp_opts(void) +int binkp_send_comp_opts(int originate) { - int rc = 0; + int rc = 0, nr = FALSE; #if defined(HAVE_ZLIB_H) || defined(HAVE_BZLIB_H) int plz = FALSE, gz = FALSE, bz2 = FALSE; char *p = NULL; @@ -2014,7 +2033,22 @@ int binkp_send_comp_opts(void) } #endif - if (plz || gz || bz2) { + Syslog('b', "Binkp: binkp_send_comp_opts(%s) NRwe=%s NRthey=%s", + originate ?"TRUE":"FALSE", opstate[bp.NRwe], opstate[bp.NRthey]); + if (originate) { + if (bp.NRwe == Want) { + Syslog('b', "Binkp: binkp_send_comp_opts(TRUE) NRwe=Want"); + nr = TRUE; + } + } else { + if ((bp.NRwe == Can)/* || (bp.NRthey == Can)*/ && (bp.NRthey == Want)) { + Syslog('b', "Binkp: binkp_send_comp_opts(FALSE) NRwe=Can NRthey=Want"); + bp.NRwe = Want; + nr = TRUE; + } + } + + if (plz || gz || bz2 || nr) { p = xstrcpy((char *)"OPT"); if (bz2 || gz) { bp.EXTCMDwe = Want; @@ -2026,6 +2060,8 @@ int binkp_send_comp_opts(void) p = xstrcat(p, (char *)" BZ2"); if (plz) p = xstrcat(p, (char *)" PLZ"); + if (nr) + p = xstrcat(p, (char *)" NR"); rc = binkp_send_command(MM_NUL,"%s", p); free(p); } @@ -2069,7 +2105,6 @@ void binkp_set_comp_state(void) } #endif - #ifdef HAVE_ZLIB_H Syslog('b', "Binkp: PLZ they=%s we=%s", opstate[bp.PLZthey], opstate[bp.PLZwe]); if ((bp.PLZthey == Want) && (bp.PLZwe == Want)) { @@ -2077,6 +2112,12 @@ void binkp_set_comp_state(void) Syslog('+', "Binkp: PLZ compression active"); } #endif + + Syslog('b', "Binkp: NR they=%s we=%s", opstate[bp.NRthey], opstate[bp.NRwe]); + if ((bp.NRthey == Want) && (bp.NRwe == Want)) { + bp.NRwe = bp.NRthey = Active; + Syslog('+', "Binkp: NR mode active"); + } } @@ -2115,6 +2156,7 @@ int binkp_recv_command(char *buf, unsigned int *len, int *cmd) } binkp_settimer(BINKP_TIMEOUT); Nopper(); + Syslog('b', "Binkp: rcvd %s %s", bstate[b0 & 0x7f], printable(buf+1, 0)); to: if (tty_status) @@ -2222,8 +2264,12 @@ void parse_m_nul(char *msg) } #endif } else if (strcmp(q, (char *)"NR") == 0) { - Syslog('b', "Binkp: remote wants NR mode, NOT SUPPORTED HERE YET"); - bp.NRthey = Want; +// Syslog('b', "Binkp: remote wants NR mode, NOT SUPPORTED HERE YET"); + Syslog('b', "Binkp: remote requests NR mode"); + if (bp.NRthey == Can) { + bp.NRthey = Want; + binkp_set_comp_state(); + } } else if (strcmp(q, (char *)"NDA") == 0) { Syslog('b', "Binkp: remote wants NDA mode, NOT SUPPORTED HERE YET"); bp.NDAthey = Want; diff --git a/mbcico/rdoptions.c b/mbcico/rdoptions.c index f0e2505a..2c46cec2 100644 --- a/mbcico/rdoptions.c +++ b/mbcico/rdoptions.c @@ -4,7 +4,7 @@ * Purpose ...............: Fidonet mailer * ***************************************************************************** - * Copyright (C) 1997-2005 + * Copyright (C) 1997-2006 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -52,6 +52,7 @@ static struct _ktab { {(char *)"Hydra", NOHYDRA}, {(char *)"PLZ", NOPLZ}, {(char *)"GZ/BZ2", NOGZBZ2}, + {(char *)"NR", NONR}, {NULL, 0} }; @@ -92,6 +93,7 @@ void rdoptions(int Loaded) localoptions |= NOZEDZAP; if (CFG.NoHydra) localoptions |= NOHYDRA; + localoptions |= NONR; #ifndef HAVE_ZLIB_H localoptions |= NOPLZ; @@ -127,6 +129,8 @@ void rdoptions(int Loaded) localoptions |= NOPLZ; if (nodes.NoGZ) localoptions |= NOGZBZ2; + if (nodes.DoNR) + localoptions &= ~NONR; logoptions(); } diff --git a/mbcico/session.h b/mbcico/session.h index c5537fe3..83c07611 100644 --- a/mbcico/session.h +++ b/mbcico/session.h @@ -62,7 +62,7 @@ extern int localoptions; #define NOHYDRA 0x0200 #define NOPLZ 0x0400 #define NOGZBZ2 0x0800 - +#define NONR 0x1000 struct _history history; /* History record for sessions */