v1.0.4 Release - 2014-09-05 - Andrew Leary.

- Added Binkp CRC support (FSP-1020).
	- Changed the "No Binkp/1.1" setting for nodes to only be effective on
	  outgoing calls.  It was causing issues for other mailers (including
	  BinkD) on incoming calls because mbcico was reporting Binkp/1.1 in
	  the VER string but then falling back to Binkp/1.0.
	- Updated the Internet Rex Binkp/1.1 bug workaround to reflect that
	  versions 2.31 and 2.67 are also affected.
This commit is contained in:
Andrew Leary 2014-09-05 17:35:37 -04:00
parent 4e4431f755
commit 880eb115d4
22 changed files with 408 additions and 149 deletions

View File

@ -40,7 +40,7 @@ NERvOus nervous@nervous.it
Bobby Cabral bobbyc@digitelone.com
Johannes Beekhuizen 2:280/1018@fidonet
Lukas De Groen 2:280/1027@fidonet
Vince Coen 2:257/609@fidonet
Vincent Coen vbcoen@gmail.com 2:250/1@fidonet
Joachim Kuwan 2:249/591@fidonet
Greek greek@voyager.nnov.ru
Sergey Nechaev 2:5015/53@fidonet
@ -57,4 +57,4 @@ val khokhlov 2:550/180@fidonet
Robert Wolfe 1:2613/4307@fidonet
Alan Ianson
Simon Voortman 2:280/1049.1@fidonet
Andrew Leary 1:320/219@fidonet

109
ChangeLog
View File

@ -1,8 +1,109 @@
v1.0.1
Fixed packaging and compiling the correct ftscprod.012
file.
v1.0.4 03-Sep-2014 - Andrew Leary
v1.0.0
1. Reverted Vince Coen's packaging changes until an upgrade
script can be written and tested.
2. Added Binkp CRC support (FSP-1020) to mbcico.
3. Changed the No Binkp/1.1 setting for nodes to be
effective on outbound calls only. It was causing issues
with other mailers (including BinkD) on inbound calls,
because mbcico was reporting binkp/1.1 in the VER string and
then downshifting to binkp/1.0.
4. Updated the Internet Rex binkp/1.1 bug workaround to
reflect that versions 2.31 and 2.67 are also affected.
v1.0.3 13-Jun-2014 - Vincent Coen
1. Changed unix/mbuseradd.c
Added extra arg to useradd -p 12345 to avoid a locked
record under Mageia v4 that prevents the password
adding a record due to a file busy may be: Lets see.
No it is not so reverted back.
2. Still looking for cause of bug.
v1.0.2 14-Mar-2014 - Vincent Coen
Changed packaging to use /home/mbse instead of /opt/mbse
to suit users with a seperate / and a /home partitions.
IT DOES NOT CHANGE THE RESULTS FOR AN EXISTING INSTALL
WHERE mbse & bbs users are set up to use /opt/mbse.
YOU WILL HAVE TO DO THIS MANUALLY.
The supplied INSTALL script has been changed.
To do this you will need to change:
1. Users mbse, bbs and all bbs users to reflect the change
of home directory from /opt/mbse to /home/mbse using your
distro's graphic system editing tool for users or if not
available use usermod via sudo etc:
usermod -m -d /home/mbse mbse
usermod -m -d /home/mbse/home/bbs bbs
usermod -m -d /home/mbse/home/user-name bbs user-name
Note that the '-m' option in usermod option is to move the
contents from the existing to the new location.
You can see the list of bbs users by running:
ls -la /opt/mbse/home
2. Using your favourite editor Change
/etc/services and
/etc/xinetd.d/mbsebbs
Replacing all instances of /opt/mbse with
/home/mbse
3. Now do the same with http and ftp config files in
/etc/httpd/conf/httpd.conf and
/etc/proftpd/proftpd.conf (or whatever ftp & web service
you use.
4. Having installed/upgraded the mbse system you must
reboot the system or stop and start mbse, xinetd, ftp,
httpd etc
services. It is easier just shuting down and starting
the system.
5. As su run cp -ap /opt/mbse /home
6. If not already done so, build the system using the usual
./configure & make and now run make install as su or if
not available do, sudo bash then su then make install
7. Change all crontab processes that deal with mbse both as
user mbse and root to reflect new directory using:
crontab -l to see what is current and then as crontab -e
to edit.
8. After rebooting the system check everything is working
Then I would suggest renaming /opt/mbse say from /opt/mbse
/opt/old-mbse and leave it a few days before deleting when
you are SURE that all is working.
9. Now when you change the /boot partition or install a new
version of your distro you can continue to use your /home
as is but do not forget to recreate the crontab, xinetd,
rc.d/init.d/mbseb etc as needed by using cp -vp from the
old partition to the new or failing that create a modified
version of SETUP.sh as needed and run it.
...........NOW READ THE ABOVE, AGAIN..................
lib/
libmbse.a:
Replaced ftscprod.014 with ftscprod.016
v1.0.1 Dec 2013 - Vincent Coen
lib/
libmbse.a:
Fixed packaging and compiling the correct ftscprod
file to ftscprod.014.
v1.0.0 Dec 2013?
This is the last version of mbsebbs submitted by me,
Michiel.

View File

@ -17,8 +17,8 @@ Internal mail format is JAM (c) messagebase.
Full tic file support, including extended
tic files.
OS: GNU/Linux and *BSD, 32/64 bit versions.
Originating sites 2:280/2802@fidonet and
http://www.mbse.eu/
http://sourceforge.net/projects/mbsebbs
Copyright by Michiel Broek.
Released under the terms of the GNU Public
License.

6
configure vendored
View File

@ -2309,10 +2309,10 @@ SUBDIRS="lib mbcico mbfido mbmon mbsebbs mbutils mbnntp mbtask mbsetup unix lang
PACKAGE="mbsebbs"
MAJOR="1"
MINOR="0"
REVISION="1"
REVISION="4"
VERSION="$MAJOR.$MINOR.$REVISION"
COPYRIGHT="Copyright (C) 1997-2013 Michiel Broek, All Rights Reserved"
SHORTRIGHT="Copyright (C) 1997-2013 M. Broek"
COPYRIGHT="Copyright (C) 1997-2014 Michiel Broek, All Rights Reserved"
SHORTRIGHT="Copyright (C) 1997-2014 M. Broek"
GROUP="bbs"
OWNER="mbse"
ROWNER="`id -un root`"

View File

@ -12,10 +12,10 @@ AC_SUBST(SUBDIRS)
PACKAGE="mbsebbs"
MAJOR="1"
MINOR="0"
REVISION="1"
REVISION="4"
VERSION="$MAJOR.$MINOR.$REVISION"
COPYRIGHT="Copyright (C) 1997-2013 Michiel Broek, All Rights Reserved"
SHORTRIGHT="Copyright (C) 1997-2013 M. Broek"
COPYRIGHT="Copyright (C) 1997-2014 Michiel Broek, All Rights Reserved"
SHORTRIGHT="Copyright (C) 1997-2014 M. Broek"
GROUP="bbs"
OWNER="mbse"
ROWNER="`id -un root`"

View File

@ -296,3 +296,7 @@
16FF,RNtrack,Linux/BSD/AIX/Solaris/MacOSX/OS2/DOS/Win32,Packer,Alex_Soukhotine,2:5030/1157,20050115
17FF,Msg2Pkt,DOS/OS2/Win32,Packer/Tools/ClpLib,Ulrich_Schroeter,2:244/1120,20080607
18FF,Marena,DOS,Repacker/Echotag_renamer,Michiel_van_der_Vlist,2:280/5555,20080608
19FF,jNode,Java_Virtual_Machine,Binkp_mailer/tosser/tracker,Ivan_Agarkov,2:5020/848,20120921
1AFF,mfreq,Linux,File_Request_Processor,Markus_Reschke,2:240/1661,20131116
1BFF,AfterShock,Android_>=V2.3,Binkp_Mailer/Tosser/Editor,Anatoly_Vdovichev,2:5000/26.180,20131128
1CFF,FTN::Packet,Perl,Tosser,Robert_James_Clay,1:120/419,20131219

View File

@ -1188,7 +1188,7 @@ struct sysconfig {
unsigned NoFreqs : 1; /* Don't allow requests */
unsigned NoCall : 1; /* Don't call */
unsigned NoMD5 : 1; /* Don't do MD5 */
unsigned xNoCRC32 : 1;
unsigned NoCRC32 : 1; /* Don't do Binkp CRC32 */
unsigned NoEMSI : 1; /* Don't do EMSI */
unsigned NoWazoo : 1; /* Don't do Yooho/2U2 */
unsigned NoZmodem : 1; /* Don't do Zmodem */
@ -1699,7 +1699,7 @@ struct _nodes {
unsigned WrongEscape : 1; /* Binkp wrong escape */
unsigned NoBinkp11 : 1; /* No binkp/1.1 mode */
unsigned IgnHold : 1; /* Ignore Hold/Down status */
char xExtra[94];
int32_t StartDate; /* Node start date */
int32_t LastDate; /* Last action date */
@ -1737,6 +1737,7 @@ struct _nodes {
unsigned Dir_in_waitclr : 1; /* Inbound wait for clear */
unsigned Dir_in_mklck : 1; /* Inbound create lock */
unsigned Tic4d : 1; /* 4d addresses in ticfile */
unsigned DoCRC : 1; /* Enable Binkp CRC check */
/* FTP transfers */
char FTP_site[65]; /* Site name or IP address */

View File

@ -11,7 +11,7 @@ SRCS = zmmisc.c zmrle.c zmrecv.c zmsend.c binkp.c md5b.c \
recvbark.c respfreq.c sendbark.c tcp.c tcpproto.c wazoo.c \
filetime.c ftsc.c atoul.c portsel.c telnet.c bopenfile.c \
ttyio.c lutil.c scanout.c emsi.c ulock.c dirlock.c \
callstat.c session.c call.c mbcico.c \
callstat.c session.c call.c htoul.c mbcico.c \
outstat.c nlinfo.c mbout.c
HDRS = zmodem.h binkp.h config.h statetbl.h md5b.h \
xmsend.h xmrecv.h m7recv.h m7send.h hydra.h inbound.h \
@ -20,7 +20,7 @@ HDRS = zmodem.h binkp.h config.h statetbl.h md5b.h \
recvbark.h respfreq.h sendbark.h tcp.h tcpproto.h wazoo.h \
filetime.h ftsc.h atoul.h portsel.h telnet.h bopenfile.h \
ttyio.h lutil.h scanout.h emsi.h ulock.h dirlock.h \
callstat.h session.h call.h mbcico.h \
callstat.h session.h call.h htoul.h mbcico.h \
outstat.h nlinfo.h
MBCICO_OBJS = zmmisc.o zmrle.o zmrecv.o zmsend.o binkp.o md5b.o \
xmsend.o xmrecv.o m7recv.o m7send.o hydra.o inbound.o \
@ -29,7 +29,7 @@ MBCICO_OBJS = zmmisc.o zmrle.o zmrecv.o zmsend.o binkp.o md5b.o \
recvbark.o respfreq.o sendbark.o tcp.o tcpproto.o wazoo.o \
filetime.o ftsc.o atoul.o portsel.o telnet.o bopenfile.o \
ttyio.o lutil.o scanout.o emsi.o ulock.o dirlock.o \
callstat.o session.o call.o mbcico.o
callstat.o session.o call.o htoul.o mbcico.o
MBOUT_OBJS = outstat.o nlinfo.o mbout.o scanout.o callstat.o
SLIBS = ../lib/libmbse.a ../lib/libmsgbase.a ../lib/libdbase.a ../lib/libnodelist.a
OTHER = Makefile README
@ -130,6 +130,7 @@ dirlock.o: ../config.h ../lib/mbselib.h dirlock.h
callstat.o: ../config.h ../lib/mbselib.h callstat.h
session.o: ../config.h ../lib/mbselib.h ../lib/nodelist.h ttyio.h statetbl.h emsi.h ftsc.h session.h yoohoo.h mbcico.h binkp.h callstat.h inbound.h opentcp.h telnet.h
call.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/nodelist.h ../lib/mbsedb.h session.h callstat.h call.h config.h dial.h lutil.h portsel.h openport.h opentcp.h rdoptions.h inbound.h
htoul.o: ../config.h ../lib/mbselib.h htoul.h
mbcico.o: ../config.h ../lib/mbselib.h ../lib/nodelist.h ../lib/users.h ../lib/mbsedb.h config.h answer.h call.h lutil.h mbcico.h session.h binkp.h
outstat.o: ../config.h ../lib/mbselib.h ../lib/nodelist.h ../lib/users.h ../lib/mbsedb.h scanout.h callstat.h outstat.h
nlinfo.o: ../config.h ../lib/mbselib.h ../lib/nodelist.h nlinfo.h

View File

@ -161,6 +161,8 @@ struct binkprec {
int rxcompressed; /* Receiver compressed bytes */
char *ropts; /* Receiver M_FILE optional args */
int rmode; /* Receiver compression mode */
int rcrc32; /* Receiver file crc32 */
int rcrcerr; /* Receiver CRC error count */
struct timezone tz; /* Timezone */
@ -197,12 +199,15 @@ struct binkprec {
int BZ2we; /* BZ2 compression flag */
int BZ2they;
#endif
int NRwe; /* NR mode */
int NRthey;
int NDwe; /* ND mode */
int NDthey;
int NDAwe; /* NDA mode */
int NDAthey;
int CRCwe; /* CRC mode */
int CRCthey;
};
@ -236,7 +241,7 @@ char *binkp2unix(char *); /* Unix -> Binkp escape */
void fill_binkp_list(binkp_list **, file_list *, off_t); /* Build pending files */
int binkp_pendingfiles(void); /* Count pending files */
void binkp_clear_filelist(int); /* Clear current filelist */
unsigned int htoul(char *); /* Convert ASCII hex to uns int */
static int orgbinkp(void); /* Originate session state */
static int ansbinkp(void); /* Answer session state */
static int file_transfer(void); /* File transfer state */
@ -264,6 +269,7 @@ int binkp(int role)
bp.txbuf = calloc(MAX_BLKSIZE + 3, sizeof(unsigned char));
bp.rname = calloc(512, sizeof(char));
bp.ropts = calloc(512, sizeof(char));
bp.rcrcerr = 0;
bp.rxfp = NULL;
bp.local_EOB = FALSE;
bp.remote_EOB = FALSE;
@ -300,6 +306,10 @@ int binkp(int role)
bp.NRwe = Can;
else
bp.NRwe = Want;
if (localoptions & NOCRC)
bp.CRCthey = bp.CRCwe = No;
else
bp.CRCthey = bp.CRCwe = Can;
bp.NRthey = Can;
bp.NDwe = No;
bp.NDthey = No;
@ -321,7 +331,7 @@ int binkp(int role)
goto binkpend;
}
if (((Loaded && nodes.NoBinkp11) || bp.buggyIrex) && (bp.Major == 1) && (bp.Minor != 0)) {
if ((bp.buggyIrex) && (bp.Major == 1) && (bp.Minor != 0)) {
Syslog('+', "Binkp: forcing downgrade to binkp/1.0 protocol");
bp.Major = 1;
bp.Minor = 0;
@ -705,6 +715,14 @@ SM_STATE(WaitConn)
}
}
if (!CFG.NoCRC32) {
char s[8]; /* Send OPT CRC if it's not disabled. */
strcpy(s, "OPT CRC");
if ((rc = binkp_send_command(MM_NUL, "%s", s))) {
SM_ERROR;
}
}
if ((rc = binkp_banner(FALSE))) {
SM_ERROR;
}
@ -935,6 +953,10 @@ SM_STATE(Opts)
Syslog('b', "Binkp: no PLZ compression for this node");
}
#endif
if (localoptions & NOCRC) {
bp.CRCwe = bp.CRCthey = No;
Syslog('b', "Binkp: no CRC mode for this node");
}
binkp_send_comp_opts(FALSE);
binkp_set_comp_state();
@ -1061,6 +1083,7 @@ TrType binkp_receiver(void)
off_t rxbytes;
int bcmd, rc = 0;
int rc1 = 0, nget = bp.blklen, zavail, nput;
int rc2 = 0;
char zbuf[ZBLKSIZE];
char *buf = bp.rxbuf;
@ -1148,6 +1171,13 @@ TrType binkp_receiver(void)
bp.rmode = CompGZ;
else if (strcmp((char *)"BZ2", bp.ropts) == 0)
bp.rmode = CompBZ2;
if (bp.CRCthey == Active) {
bp.rcrc32 = htoul(bp.ropts);
if (bp.rcrc32 == 0xffffffff) {
Syslog('b', "Binkp: No CRC in M_FILE - disabling CRC check");
bp.CRCthey = bp.CRCwe = No;
}
}
} else {
/*
* Corrupted command, in case this was serious, send the M_GOT back so it's
@ -1219,7 +1249,7 @@ TrType binkp_receiver(void)
if ((bp.rsize / (sfs.f_bsize + 1)) >= sfs.f_bfree) {
Syslog('!', "Binkp: only %u blocks free (need %u) in %s for this file", sfs.f_bfree,
(unsigned int)(bp.rsize / (sfs.f_bsize + 1)), tempinbound);
bclosefile(FALSE);
bclosefile(FALSE, FALSE, 0);
bp.rxfp = NULL; /* Force SKIP command */
}
}
@ -1229,8 +1259,8 @@ TrType binkp_receiver(void)
* We already got this file, send GOT so it will
* be deleted at the remote.
*/
Syslog('+', "Binkp: already got %s, sending GOT", bp.rname);
rc = binkp_send_command(MM_GOT, "%s %ld %ld", bp.rname, bp.rsize, bp.rtime);
Syslog('+', "Binkp: already got %s, sending GOT", bp.rname);
rc = binkp_send_command(MM_GOT, "%s %ld %ld", bp.rname, bp.rsize, bp.rtime);
bp.RxState = RxWaitF;
bp.rxfp = NULL;
if (rc)
@ -1290,7 +1320,7 @@ TrType binkp_receiver(void)
return Ok;
} else if (bcmd == MM_FILE) {
Syslog('+', "Binkp: partial received file, saving");
bclosefile(FALSE);
bclosefile(FALSE, FALSE, 0);
bp.rxfp = NULL;
bp.RxState = RxAccF;
return Continue;
@ -1378,22 +1408,42 @@ TrType binkp_receiver(void)
bp.rxpos += written;
if (bp.rxpos == bp.rsize) {
rc = binkp_send_command(MM_GOT, "%s %ld %ld", bp.rname, bp.rsize, bp.rtime);
bclosefile(TRUE);
rc2 = bclosefile(TRUE, (bp.CRCwe == Active), bp.rcrc32);
if (rc2) {
if (rc2 == 2) {
bp.rcrcerr++;
if (bp.rcrcerr == 1) {
/* First CRC error */
rc = binkp_send_command(MM_SKIP, "%s %ld %ld", bp.rname, bp.rsize, bp.rtime);
bp.RxState = RxWaitF;
if (rc)
return Failure;
else
return Ok;
} else {
rc = binkp_send_command(MM_ERR, "Too many CRC errors - session aborted.");
bp.RxState = RxDone;
bp.rxfp = NULL;
bp.rc = MBERR_FTRANSFER;
return Failure;
}
}
}
rc = binkp_send_command(MM_GOT, "%s %ld %ld", bp.rname, bp.rsize, bp.rtime);
bp.rxpos = bp.rxpos - bp.rxbytes;
gettimeofday(&rxtvend, &bp.tz);
#if defined(HAVE_ZLIB_H) || defined(HAVE_BZLIB_H)
if (bp.rxcompressed)
Syslog('+', "Binkp: %s", compress_stat(bp.rxpos, bp.rxcompressed));
Syslog('+', "Binkp: %s", compress_stat(bp.rxpos, bp.rxcompressed));
#endif
Syslog('+', "Binkp: OK %s", transfertime(rxtvstart, rxtvend, bp.rxpos, FALSE));
rcvdbytes += bp.rxpos;
bp.RxState = RxWaitF;
if (rc)
return Failure;
Syslog('+', "Binkp: OK %s", transfertime(rxtvstart, rxtvend, bp.rxpos, FALSE));
rcvdbytes += bp.rxpos;
bp.RxState = RxWaitF;
if (rc)
return Failure;
else
return Ok;
}
return Ok;
}
bp.RxState = RxReceD;
return Ok;
} else if (bp.RxState == RxEOB) {
@ -1536,20 +1586,23 @@ TrType binkp_transmitter(void)
bp.tmode = CompNone;
extra = (char *)"";
if ((tmp->compress == CompGZ) || (tmp->compress == CompBZ2)) {
bp.tmode = tmp->compress;
Syslog('b', "Binkp: compress_init start");
if ((rc1 = compress_init(bp.tmode))) {
Syslog('+', "Binkp: compress_init failed (rc=%d)", rc1);
tmp->compress = CompNone;
bp.tmode = CompNone;
if ((bp.CRCwe == Active)) {
Syslog('b', "Binkp: CRC mode active - GZ/BZ2 compression disabled");
} else {
if ((tmp->compress == CompGZ) || (tmp->compress == CompBZ2)) {
bp.tmode = tmp->compress;
Syslog('b', "Binkp: compress_init start");
if ((rc1 = compress_init(bp.tmode))) {
Syslog('+', "Binkp: compress_init failed (rc=%d)", rc1);
tmp->compress = CompNone;
bp.tmode = CompNone;
} else {
if (bp.tmode == CompBZ2)
extra = (char *)" BZ2";
else if (bp.tmode == CompGZ)
extra = (char *)" GZ";
else if (bp.tmode == CompGZ)
extra = (char *)" GZ";
Syslog('b', "Binkp: compress_init ok, extra=%s", extra);
}
}
}
@ -1559,8 +1612,13 @@ TrType binkp_transmitter(void)
Syslog('+', "Binkp: send \"%s\" as \"%s\"", MBSE_SS(tmp->local), MBSE_SS(tmp->remote));
Syslog('+', "Binkp: size %u bytes, dated %s, comp %s",
(unsigned int)tmp->size, date(tmp->date), cpstate[bp.tmode]);
rc = binkp_send_command(MM_FILE, "%s %u %d %d%s", MBSE_SS(tmp->remote),
if ((bp.CRCwe == Active)) {
Syslog('b', "Binkp: CRC active - file %s CRC %x", MBSE_SS(tmp->local), (int)tmp->crc32);
rc = binkp_send_command(MM_FILE, "%s %u %d %d %x", MBSE_SS(tmp->remote), (unsigned int)tmp->size, (int)tmp->date, (unsigned int)tmp->offset, (int)tmp->crc32);
} else {
rc = binkp_send_command(MM_FILE, "%s %u %d %d%s", MBSE_SS(tmp->remote),
(unsigned int)tmp->size, (int)tmp->date, (unsigned int)tmp->offset, extra);
}
if (rc) {
bp.TxState = TxDone;
return Failure;
@ -2013,16 +2071,13 @@ int binkp_banner(int originate)
return rc;
}
/*
* Send compression options
*/
int binkp_send_comp_opts(int originate)
{
int rc = 0, nr = FALSE;
#if defined(HAVE_ZLIB_H) || defined(HAVE_BZLIB_H)
int rc = 0, nr = FALSE, crc = FALSE;
int plz = FALSE, gz = FALSE, bz2 = FALSE;
char *p = NULL;
@ -2046,6 +2101,11 @@ int binkp_send_comp_opts(int originate)
}
#endif
if ((bp.CRCwe == Can) || (bp.CRCthey == Can) || (bp.CRCthey == Want)) {
crc = TRUE;
bp.CRCwe = Want;
}
Syslog('b', "Binkp: binkp_send_comp_opts(%s) NRwe=%s NRthey=%s",
originate ?"TRUE":"FALSE", opstate[bp.NRwe], opstate[bp.NRthey]);
if (originate) {
@ -2061,7 +2121,7 @@ int binkp_send_comp_opts(int originate)
}
}
if (plz || gz || bz2 || nr) {
if (plz || gz || bz2 || nr || crc) {
p = xstrcpy((char *)"OPT");
if (bz2 || gz) {
bp.EXTCMDwe = Want;
@ -2075,10 +2135,11 @@ int binkp_send_comp_opts(int originate)
p = xstrcat(p, (char *)" PLZ");
if (nr)
p = xstrcat(p, (char *)" NR");
if (crc)
p = xstrcat(p, (char *)" CRC");
rc = binkp_send_command(MM_NUL,"%s", p);
free(p);
}
#endif
return rc;
}
@ -2123,6 +2184,11 @@ void binkp_set_comp_state(void)
bp.NRwe = bp.NRthey = Active;
Syslog('+', "Binkp: NR mode active");
}
Syslog('b', "Binkp: CRC they=%s we=%s", opstate[bp.CRCthey], opstate[bp.CRCwe]);
if ((bp.CRCthey == Want) && (bp.CRCwe == Want)) {
bp.CRCwe = bp.CRCthey = Active;
Syslog ('+', "Binkp: CRC mode active");
}
}
@ -2203,13 +2269,13 @@ void parse_m_nul(char *msg)
bp.Minor = atoi(q + 1);
}
/*
* Irex 2.24 upto 2.29 claims binkp/1.1 while it is binkp/1.0
* Irex 2.24 upto 2.67 claims binkp/1.1 while it is binkp/1.0
* Set a flag so we can activate a workaround. This only works
* for incoming sessions.
*/
if ((p = strstr(msg+4, "Internet Rex 2."))) {
q = strtok(p + 15, (char *)" \0");
if ((atoi(q) >= 24) && (atoi(q) <= 29)) {
if ((atoi(q) >= 24) && (atoi(q) <= 67)) {
Syslog('b', " : Irex bug detected, workaround activated");
bp.buggyIrex = TRUE;
}
@ -2280,7 +2346,14 @@ void parse_m_nul(char *msg)
} else if (strcmp(q, (char *)"ND") == 0) {
Syslog('b', "Binkp: remote wants ND mode, NOT SUPPORTED HERE YET");
bp.NDthey = Want;
}
} else if (strcmp(q, (char *)"CRC") == 0) {
Syslog('b', "Binkp: remote requests CRC mode");
if (bp.CRCthey == Can) {
bp.CRCthey = Want;
binkp_set_comp_state();
}
}
}
} else {
@ -2761,6 +2834,7 @@ void fill_binkp_list(binkp_list **bkll, file_list *fal, off_t offs)
(*tmpl)->size = tstat.st_size;
(*tmpl)->date = tstat.st_mtime;
(*tmpl)->compress = CompNone;
(*tmpl)->crc32 = file_crc(fal->local, FALSE);
/*
* Search compression method, but only if GZ or BZ2 compression is active.

View File

@ -81,6 +81,7 @@ typedef struct _binkp_list {
time_t date; /* File date & time */
off_t offset; /* Start offset */
int compress; /* Compression state */
int crc32; /* File CRC32 checksum */
} binkp_list;

View File

@ -127,16 +127,17 @@ FILE *bopenfile(char *fname, time_t remtime, off_t remsize, off_t *resofs)
* file so that in a next session we know we must append to that file instead of
* trying to get the file again.
*/
int bclosefile(int success)
int bclosefile(int success, int CRCflag, int crc)
{
int rc = 0;
int tmpcrc;
struct utimbuf ut;
char *temp;
Syslog('b', "Binkp: closefile(), for file \"%s\"", MBSE_SS(infpath));
if ((infp == NULL) || (infpath == NULL)) {
Syslog('+', "Binkp: closefile(), nothing to close");
Syslog('+', "Binkp: bclosefile(), nothing to close");
return 1;
}
@ -169,9 +170,24 @@ int bclosefile(int success)
else
Syslog('b', "Binkp: unlinked %s", temp);
/* If CRC mode is active, check the CRC of the received file. */
if (CRCflag) {
tmpcrc = file_crc(infpath, FALSE);
if (tmpcrc != crc) { /* CRC check failed. */
Syslog('!', "Binkp: CRC error %s Expected %x Got %x", infpath, crc, tmpcrc);
unlink(infpath); /* Remove file with incorrect CRC. */
isfreq = FALSE;
free(infpath);
infpath = NULL;
return 2;
}
}
/*
* Move file from extra tmp to normal tempinbound.
*/
snprintf(temp, PATH_MAX, "%s/%s", tempinbound, basename(infpath));
if (rc == 0) {

View File

@ -4,6 +4,6 @@
#define _BOPENFILE_H
FILE *bopenfile(char *, time_t, off_t, off_t *);
int bclosefile(int);
int bclosefile(int, int, int);
#endif

44
mbcico/htoul.c Normal file
View File

@ -0,0 +1,44 @@
/*****************************************************************************
*
* $Id: htoul.c,v 1.6 2005/10/11 20:49:46 mbse Exp $
* Purpose ...............: Fidonet mailer
*
*****************************************************************************
* Copyright (C) 1997-2005
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
* 1971 BV IJmuiden
* the Netherlands
*
* This file is part of MBSE BBS.
*
* This BBS is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* MBSE BBS is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MBSE BBS; see the file COPYING. If not, write to the Free
* Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*****************************************************************************/
#include "../config.h"
#include "../lib/mbselib.h"
#include "htoul.h"
unsigned int htoul(char *str)
{
unsigned int x;
if (sscanf(str,"%x",&x) == 1)
return x;
else return 0xffffffff;
}

9
mbcico/htoul.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef _HTOUL_H
#define _HTOUL_H
/* $Id: htoul.h,v 1.2 2005/10/11 20:49:46 mbse Exp $ */
unsigned int htoul(char *);
#endif

View File

@ -53,6 +53,7 @@ static struct _ktab {
{(char *)"PLZ", NOPLZ},
{(char *)"GZ/BZ2", NOGZBZ2},
{(char *)"NR", NONR},
{(char *)"CRC", NOCRC},
{NULL, 0}
};
@ -93,6 +94,8 @@ void rdoptions(int Loaded)
localoptions |= NOZEDZAP;
if (CFG.NoHydra)
localoptions |= NOHYDRA;
if (CFG.NoCRC32)
localoptions |= NOCRC;
localoptions |= NONR;
#ifndef HAVE_ZLIB_H
@ -131,6 +134,8 @@ void rdoptions(int Loaded)
localoptions |= NOGZBZ2;
if (nodes.DoNR)
localoptions &= ~NONR;
if (nodes.DoCRC)
localoptions &= ~NOCRC;
logoptions();
}

View File

@ -67,6 +67,7 @@ extern int localoptions;
#define NOPLZ 0x0400
#define NOGZBZ2 0x0800
#define NONR 0x1000
#define NOCRC 0x2000
struct _history history; /* History record for sessions */

View File

@ -54,7 +54,7 @@ void ProgName(void)
return;
mbse_colour(WHITE, BLACK);
printf("\nMBAFF: MBSE BBS %s Announce new files and FileFind\n", VERSION);
printf("\nMBAFF: MBSE BBS %s Announce New Files and FileFind\n", VERSION);
mbse_colour(YELLOW, BLACK);
printf(" %s\n", COPYRIGHT);
}

View File

@ -59,7 +59,7 @@ void ProgName(void)
return;
mbse_colour(WHITE, BLACK);
printf("\nMBDIFF: MBSE BBS %s Nodelist diff processor\n", VERSION);
printf("\nMBDIFF: MBSE BBS %s Nodelist Diff Processor\n", VERSION);
mbse_colour(YELLOW, BLACK);
printf(" %s\n", COPYRIGHT);
}

View File

@ -157,7 +157,7 @@ void ProgName(void)
return;
mbse_colour(WHITE, BLACK);
printf("\nMBFIDO: MBSE BBS %s - Fidonet File and Mail processor\n", VERSION);
printf("\nMBFIDO: MBSE BBS %s - Fidonet File and Mail Processor\n", VERSION);
mbse_colour(YELLOW, BLACK);
printf(" %s\n", COPYRIGHT);
}

View File

@ -52,7 +52,7 @@ void ProgName(void)
return;
mbse_colour(WHITE, BLACK);
printf("\nMBFILE: MBSE BBS %s File maintenance utility\n", VERSION);
printf("\nMBFILE: MBSE BBS %s File Maintenance Utility\n", VERSION);
mbse_colour(YELLOW, BLACK);
printf(" %s\n", COPYRIGHT);
}

View File

@ -1302,19 +1302,19 @@ void s_mailer(void)
mbse_mvprintw(15, 2, "9. No callout");
mbse_mvprintw(16, 2, "10. No EMSI session");
mbse_mvprintw(17, 2, "11. No Yooho/2U2");
mbse_mvprintw(12,31, "12. No CRC");
mbse_mvprintw(13,31, "13. No Zmodem");
mbse_mvprintw(14,31, "14. No Zedzap");
mbse_mvprintw(15,31, "15. No Hydra");
mbse_mvprintw(16,31, "16. No MD5");
mbse_mvprintw(17,31, "17. Zero Locks OK");
mbse_mvprintw(13,31, "12. No Zmodem");
mbse_mvprintw(14,31, "13. No Zedzap");
mbse_mvprintw(15,31, "14. No Hydra");
mbse_mvprintw(16,31, "15. No MD5");
mbse_mvprintw(17,31, "16. Zero Locks OK");
mbse_mvprintw(12,59, "17. Phonetrans 1-10");
mbse_mvprintw(13,59, "18. Phonetrans 11-20");
mbse_mvprintw(14,59, "19. Phonetrans 21-30");
mbse_mvprintw(15,59, "20. Phonetrans 31-40");
mbse_mvprintw(16,59, "21. Max. files");
mbse_mvprintw(17,59, "22. Max. MB.");
mbse_mvprintw(12,59, "18. Phonetrans 1-10");
mbse_mvprintw(13,59, "19. Phonetrans 11-20");
mbse_mvprintw(14,59, "20. Phonetrans 21-30");
mbse_mvprintw(15,59, "21. Phonetrans 31-40");
mbse_mvprintw(16,59, "22. Max. files");
mbse_mvprintw(17,59, "23. Max. MB.");
}
@ -1368,7 +1368,7 @@ void e_mailer(void)
show_bool(15,23, CFG.NoCall);
show_bool(16,23, CFG.NoEMSI);
show_bool(17,23, CFG.NoWazoo);
show_bool(12,52, CFG.NoCRC32);
show_bool(13,52, CFG.NoZmodem);
show_bool(14,52, CFG.NoZedzap);
show_bool(15,52, CFG.NoHydra);
@ -1378,7 +1378,7 @@ void e_mailer(void)
show_int( 16,75, CFG.Req_Files);
show_int( 17,75, CFG.Req_MBytes);
switch(select_menu(22)) {
switch(select_menu(23)) {
case 0: return;
case 1: E_LOGL(CFG.cico_loglevel, "1.14.1", s_mailer)
case 2: E_STR( 8,23,20,CFG.IP_Phone, "The mailer ^TCP/IP \"phone\" number^ for this system, empty is no TCP/IP")
@ -1389,21 +1389,21 @@ void e_mailer(void)
case 7: E_INT( 13,23, CFG.dialdelay, "The ^random dialdelay^ in seconds ((^n^ <= delay) and (^n^ > (delay / 10)))")
case 8: E_BOOL(14,23, CFG.NoFreqs, "Set to true if ^No Filerequests^ are allowed")
case 9: E_BOOL(15,23, CFG.NoCall, "Set to true if ^No Calls^ are allowed")
case 10:E_BOOL(16,23, CFG.NoEMSI, "If set then ^EMSI handshake^ is diabled")
case 10:E_BOOL(16,23, CFG.NoEMSI, "If set then ^EMSI handshake^ is disabled")
case 11:E_BOOL(17,23, CFG.NoWazoo, "If set then ^YooHoo/2U2^ (FTSC-0006) is disabled")
case 12:E_BOOL(12,52, CFG.NoCRC32, "If set then ^CRC32^ in binkp sessions is disabled")
case 13:E_BOOL(13,52, CFG.NoZmodem, "If set then the ^Zmodem^ protocol is disabled")
case 14:E_BOOL(14,52, CFG.NoZedzap, "If set then the ^Zedzap^ protocol is disabled")
case 15:E_BOOL(15,52, CFG.NoHydra, "If set then the ^Hydra^ protocol is disabled")
case 16:E_BOOL(16,52, CFG.NoMD5, "Disable ^MD5 crypted^ passwords with binkp sessions")
case 17:E_BOOL(17,52, CFG.ZeroLocks, "Allow ^zero byte node lockfiles^ created by another OS")
case 12:E_BOOL(13,52, CFG.NoZmodem, "If set then the ^Zmodem^ protocol is disabled")
case 13:E_BOOL(14,52, CFG.NoZedzap, "If set then the ^Zedzap^ protocol is disabled")
case 14:E_BOOL(15,52, CFG.NoHydra, "If set then the ^Hydra^ protocol is disabled")
case 15:E_BOOL(16,52, CFG.NoMD5, "Disable ^MD5 crypted^ passwords with binkp sessions")
case 16:E_BOOL(17,52, CFG.ZeroLocks, "Allow ^zero byte node lockfiles^ created by another OS")
case 17:e_trans(0, 17); break;
case 18:e_trans(10, 18); break;
case 19:e_trans(20, 19); break;
case 20:e_trans(30, 20); break;
case 21:E_INT(16,75, CFG.Req_Files, "Maximum ^files^ to request, 0 is unlimited")
case 22:E_INT(17,75, CFG.Req_MBytes, "Maximum ^MBytes^ to request, 0 is unlimited")
case 18:e_trans(0, 17); break;
case 19:e_trans(10, 18); break;
case 20:e_trans(20, 19); break;
case 21:e_trans(30, 20); break;
case 22:E_INT(16,75, CFG.Req_Files, "Maximum ^files^ to request, 0 is unlimited")
case 23:E_INT(17,75, CFG.Req_MBytes, "Maximum ^MBytes^ to request, 0 is unlimited")
}
}
}
@ -2270,6 +2270,7 @@ int global_doc(FILE *fp, FILE *toc, int page)
add_webtable(wp, (char *)"No Calls", getboolean(CFG.NoCall));
add_webtable(wp, (char *)"No EMSI", getboolean(CFG.NoEMSI));
add_webtable(wp, (char *)"No YooHoo/2U2", getboolean(CFG.NoWazoo));
add_webtable(wp, (char *)"No CRC32", getboolean(CFG.NoCRC32));
add_webtable(wp, (char *)"No Zmodem", getboolean(CFG.NoZmodem));
add_webtable(wp, (char *)"No Zedzap", getboolean(CFG.NoZedzap));
add_webtable(wp, (char *)"No Hydra", getboolean(CFG.NoHydra));
@ -2294,6 +2295,7 @@ int global_doc(FILE *fp, FILE *toc, int page)
fprintf(fp, " No Calls %s\n", getboolean(CFG.NoCall));
fprintf(fp, " No EMSI %s\n", getboolean(CFG.NoEMSI));
fprintf(fp, " No YooHoo/2U2 %s\n", getboolean(CFG.NoWazoo));
fprintf(fp, " No CRC32 %s\n", getboolean(CFG.NoCRC32));
fprintf(fp, " No Zmodem %s\n", getboolean(CFG.NoZmodem));
fprintf(fp, " No Zedzap %s\n", getboolean(CFG.NoZedzap));
fprintf(fp, " No Hydra %s\n", getboolean(CFG.NoHydra));

View File

@ -807,32 +807,32 @@ void SessionScreen(void)
{
clr_index();
set_color(WHITE, BLACK);
mbse_mvprintw( 5, 6, "7.3 EDIT NODE SESSION");
mbse_mvprintw( 5, 2, "7.3 EDIT NODE SESSION");
set_color(CYAN, BLACK);
mbse_mvprintw( 7, 6, "1. Session passwd");
mbse_mvprintw( 8, 6, "2. Dial command");
mbse_mvprintw( 9, 6, "3. Phone number 1");
mbse_mvprintw(10, 6, "4. Phone number 2");
mbse_mvprintw(11, 6, "5. Nodelist flags");
mbse_mvprintw(12, 6, "6. Inet hostname");
mbse_mvprintw(13, 6, "7. Outbound sess.");
mbse_mvprintw(14, 6, "8. Inbound sess.");
mbse_mvprintw(15, 6, "9. No EMSI");
mbse_mvprintw(16, 6, "10. No YooHoo/2U2");
mbse_mvprintw(17, 6, "11. No Filerequest");
mbse_mvprintw(18, 6, "12. Don't call");
mbse_mvprintw(19, 6, "13. 8.3 names");
mbse_mvprintw(20, 6, "14. NR mode");
mbse_mvprintw(13,41, "15. No PLZ");
mbse_mvprintw(14,41, "16. No GZ/BZ2");
mbse_mvprintw(15,41, "17. No Zmodem");
mbse_mvprintw(16,41, "18. No Zedzap");
mbse_mvprintw(17,41, "19. No Hydra");
mbse_mvprintw(18,41, "20. Binkp old esc");
mbse_mvprintw(19,41, "21. No binkp/1.1");
mbse_mvprintw(20,41, "22. Ign. Hold");
mbse_mvprintw( 7, 2, "1. Session passwd");
mbse_mvprintw( 8, 2, "2. Dial command");
mbse_mvprintw( 9, 2, "3. Phone number 1");
mbse_mvprintw(10, 2, "4. Phone number 2");
mbse_mvprintw(11, 2, "5. Nodelist flags");
mbse_mvprintw(12, 2, "6. Inet hostname");
mbse_mvprintw(13, 2, "7. Outbound sess.");
mbse_mvprintw(14, 2, "8. Inbound sess.");
mbse_mvprintw(15, 2, "9. No EMSI");
mbse_mvprintw(16, 2, "10. No YooHoo/2U2");
mbse_mvprintw(17, 2, "11. No Filerequest");
mbse_mvprintw(18, 2, "12. Don't call");
mbse_mvprintw(19, 2, "13. 8.3 names");
mbse_mvprintw(13,33, "14. NR mode");
mbse_mvprintw(14,33, "15. CRC mode");
mbse_mvprintw(15,33, "16. No PLZ");
mbse_mvprintw(16,33, "17. No GZ/BZ2");
mbse_mvprintw(17,33, "18. No Zmodem");
mbse_mvprintw(18,33, "19. No Zedzap");
mbse_mvprintw(19,33, "20. No Hydra");
mbse_mvprintw(17,57, "21. Binkp old esc");
mbse_mvprintw(18,57, "22. No binkp/1.1");
mbse_mvprintw(19,57, "23. Ign. Hold");
}
@ -850,25 +850,25 @@ void SessionEdit(void)
show_str( 10,26,20, nodes.phone[1]);
show_str( 11,26,54, nodes.Nl_flags);
show_str( 12,26,40, nodes.Nl_hostname);
show_sessiontype(13,26,nodes.Session_out);
show_sessiontype(14,26,nodes.Session_in);
show_bool(15,26, nodes.NoEMSI);
show_bool(16,26, nodes.NoWaZOO);
show_bool(17,26, nodes.NoFreqs);
show_bool(18,26, nodes.NoCall);
show_bool(19,26, nodes.FNC);
show_bool(20,26, nodes.DoNR);
show_sessiontype(13,23,nodes.Session_out);
show_sessiontype(14,23,nodes.Session_in);
show_bool(15,23, nodes.NoEMSI);
show_bool(16,23, nodes.NoWaZOO);
show_bool(17,23, nodes.NoFreqs);
show_bool(18,23, nodes.NoCall);
show_bool(19,23, nodes.FNC);
show_bool(13,52, nodes.DoNR);
show_bool(14,52, nodes.DoCRC);
show_bool(15,52, nodes.NoPLZ);
show_bool(16,52, nodes.NoGZ);
show_bool(17,52, nodes.NoZmodem);
show_bool(18,52, nodes.NoZedzap);
show_bool(19,52, nodes.NoHydra);
show_bool(17,76, nodes.WrongEscape);
show_bool(18,76, nodes.NoBinkp11);
show_bool(19,76, nodes.IgnHold);
show_bool(13,61, nodes.NoPLZ);
show_bool(14,61, nodes.NoGZ);
show_bool(15,61, nodes.NoZmodem);
show_bool(16,61, nodes.NoZedzap);
show_bool(17,61, nodes.NoHydra);
show_bool(18,61, nodes.WrongEscape);
show_bool(19,61, nodes.NoBinkp11);
show_bool(20,61, nodes.IgnHold);
switch(select_menu(22)) {
switch(select_menu(23)) {
case 0: return;
case 1: E_STR( 7,26,15, nodes.Spasswd, "The ^Session password^ for this node")
case 2: E_STR( 8,26,40, nodes.dial, "If needed, give a special modem ^dial command^ for this node")
@ -876,25 +876,25 @@ void SessionEdit(void)
case 4: E_STR( 10,26,20, nodes.phone[1], "Enter ^phone number^ to override the nodelist")
case 5: E_STR( 11,26,54, nodes.Nl_flags, "^Nodelist flags^ override")
case 6: E_STR( 12,26,40, nodes.Nl_hostname, "Node internet ^hostname/IP address^ override")
case 7: nodes.Session_out = edit_sessiontype(13,26, nodes.Session_out);
case 7: nodes.Session_out = edit_sessiontype(13,23, nodes.Session_out);
break;
case 8: nodes.Session_in = edit_sessiontype(14,26, nodes.Session_in);
case 8: nodes.Session_in = edit_sessiontype(14,23, nodes.Session_in);
break;
case 9: E_BOOL(15,26, nodes.NoEMSI, "Disable ^EMSI handshake^ with this node")
case 10:E_BOOL(16,26, nodes.NoWaZOO, "Disable ^YooHoo/2U2 handshake^ (FTSC-0006) with this node")
case 11:E_BOOL(17,26, nodes.NoFreqs, "Disallow ^file requests^ from this node")
case 12:E_BOOL(18,26, nodes.NoCall, "Don't ^call^ this node")
case 13:E_BOOL(19,26, nodes.FNC, "Node needs ^DOS 8.3^ filenames")
case 14:E_BOOL(20,26, nodes.DoNR, "Use ^NR-mode^ in outgoing binkp sessions")
case 15:E_BOOL(13,61, nodes.NoPLZ, "Disable ^Binkp PLZ^ compression with this node")
case 16:E_BOOL(14,61, nodes.NoGZ, "Disable ^Binkp GZ and BZ2^ compression with this node")
case 17:E_BOOL(15,61, nodes.NoZmodem, "Disable ^Zmodem^ protocol with this node")
case 18:E_BOOL(16,61, nodes.NoZedzap, "Disable ^Zedzap^ protocol with this node")
case 19:E_BOOL(17,61, nodes.NoHydra, "Disable ^Hydra^ protocol with this node")
case 20:E_BOOL(18,61, nodes.WrongEscape, "Use the ^old escape^ for long filenames (Argus, Irex)")
case 21:E_BOOL(19,61, nodes.NoBinkp11, "Disable ^binkp/1.1^ (fallback to binkp/1.0) mode for this node")
case 22:E_BOOL(20,61, nodes.IgnHold, "Ignore node ^Hold or Down^ nodelist status")
case 9: E_BOOL(15,23, nodes.NoEMSI, "Disable ^EMSI handshake^ with this node")
case 10:E_BOOL(16,23, nodes.NoWaZOO, "Disable ^YooHoo/2U2 handshake^ (FTSC-0006) with this node")
case 11:E_BOOL(17,23, nodes.NoFreqs, "Disallow ^file requests^ from this node")
case 12:E_BOOL(18,23, nodes.NoCall, "Don't ^call^ this node")
case 13:E_BOOL(19,23, nodes.FNC, "Node needs ^DOS 8.3^ filenames")
case 14:E_BOOL(13,52, nodes.DoNR, "Use ^NR-mode^ in outgoing binkp sessions")
case 15:E_BOOL(14,52, nodes.DoCRC, "Use ^Binkp CRC^ error checking")
case 16:E_BOOL(15,52, nodes.NoPLZ, "Disable ^Binkp PLZ^ compression with this node")
case 17:E_BOOL(16,52, nodes.NoGZ, "Disable ^Binkp GZ and BZ2^ compression with this node")
case 18:E_BOOL(17,52, nodes.NoZmodem, "Disable ^Zmodem^ protocol with this node")
case 19:E_BOOL(18,52, nodes.NoZedzap, "Disable ^Zedzap^ protocol with this node")
case 20:E_BOOL(19,52, nodes.NoHydra, "Disable ^Hydra^ protocol with this node")
case 21:E_BOOL(17,76, nodes.WrongEscape, "Use the ^old escape^ for long filenames (Argus, Irex)")
case 22:E_BOOL(18,76, nodes.NoBinkp11, "Disable ^binkp/1.1^ (fallback to binkp/1.0) mode for this node")
case 23:E_BOOL(19,76, nodes.IgnHold, "Ignore node ^Hold or Down^ nodelist status")
}
}
}