Changes made in BinkleyTerm v2.60XE/Gamma-1
Bug fixes
---------
HR: No system crash at requests of PW-protected files without password.
MMP: fixed: buffer for screen not flushed
I don't think the distributed version of Binkley had this bug, as IBMC was
treated specially. But Watcom had the same problem as IBMC. The number of
minutes left is written to the screen through a file which is buffered. This
fucks up the display, if the buffer is not flushed because the other status
information was written directly to the display bypassing the buffer. Now the
buffer is flushed for both the IBMC and the Watcom versions.
MMP: Fix for ISDN caller ID using ZyXEL 2864I
When RING was seen and Binkley was about to send the answer string, it would
wait until the modem became silent for a fraction of a second. In this delay,
Binkley would read characters from the modem, and silently throw them away.
The caller ID on ISDN lines was lost in this way! This is fixed, and input
from modem in this period, is now logged as usual. Setting RingWait to 2,
would also have solved this particular problem, but there is no need to wait.
MMP: Changed config file parser
The parser used to identify keywords would recognize "CostLogThingy" as
"CostLog"; i.e. allowing the input word to be longer than the keyword. This
may sound okay, but it means that you cannot have two keywords where the
first is a prefix of the other. Also, you cannot define variables on the
command line where the name matches a keyword. This is changed now, and the
parser requires the words to be of equal length.
MMP: Source code fixes important to Watcom C only
1. Watcom C uses buffered output as IBMC does, and this caused problems with
display updates while transferring files in terminal mode. The real
problem is that buffered writes are mixed with unbuffered display output.
The work-around for the IBM compiler has been adopted for Watcom (flushing
buffers).
2. The signal stuff used to handle Ctrl-C/Break didn't work with Watcom. This
seems to be a Watcom problem; signal(SIGBREAK,SIG_IGN) is broken. The
solution is to use signal(SIGBREAK,handler) instead, letting handler()
reinstall itself on SIGBREAK and do nothing else.
TJW: Fixed Hydra buffer management bug
This caused memory corruption in original BT 2.60 release. In OS/2 on my
system this bug showed as funny attributes on the upper "windows" of BT
screen. But the effects may have varied widely depending on compiler and
system ...
TJW: Error message for "COM0?.SYS" changed to "COM.SYS"
TJW: Wrong HPFS file timestamp used
Fixed bug caused by using wrong HPFS file timestamp in SCD/EVT and file
update request handling. Now, the "last file modification" timestamp is used.
Before, "last file access" timestamp was used - which was definitely WRONG
for HPFS. This caused problems on HPFS only, because FAT file system does not
have multiple different file timestamps like HPFS (file creation, last file
access, last file modification).
TJW: Zoomed outbound view "Age" bug fixed
Weird ages of some thousand days were displayed - fixed!
TJW: Fixed cosmetical problem with password failure msg
"Trash" at end of PW: "His='', Ours='XXXXXXXX<trash>'
TJW: FREQ response packet fixes:
- time string had incorrect printf format
- time string had incorrect FTS format (should be 2 blanks in the mid!)
- put in session password into freq response packet as packet password (well,
this isn't correct in every case, but better than no password at all).
- put in destination NODE address, too. This was forgotten ...
New features
------------
CE: AKAs
Maximum number of AKAs raised from original 25 to BT-XE value of 100 AKAs.
CE: New function "ConditionalPoll"
Multi-AKA and boolean operation support implemented by Thomas Waldmann.
ConditionalPoll (also known as "FreePoll" from Arjen G. Lentz, who invented
this in his mailer XENIA) allows an Uplink (you) to reject a call from a
Downlink, if there is less mail for him than the configured minimum. This
function will only work with ISDN or a modem that reports the caller ID in
the "Ring" string.
It's possible to list up to 100 ConditionalPoll entries.
How it does work: the downlink will call you, Binkley gets the caller-ID (eg.
"RING 57313340"), searches ALL ConditionalPoll entries for matching addresses
and checks if the condition (minimum outbound size for this AKA) says "reject
call" or "accept call" for each AKA.
The exact condition is: if outbound size <= MinSize * 1024 then reject.
MinSize = 0 rejects a call only if there is really NOTHING (0 bytes) on hold.
Each result (accept=TRUE or accept=FALSE) is evaluated (together with the
result of previous calculation for this number) with the according boolean
operation "AND" or "OR" to calculate the total result.
The boolean operation listed with the first configured ConditionalPoll entry
matching a specific number does not care, you can use "Or" or "And" - it
makes no difference.
If total result is TRUE, call will be accepted. If total result is FALSE,
call will be rejected.
To reject a call Binkley sends the string configured with "Reject" to the
modem. To accept a call, Binkley sends the answer string (normal behaviour).
For downlinks who want to make a file request or send an important crash mail
immediately, Binkley builds a zero byte size file in the outbound called
"*.TRX" for each user. If the downlink gets a "call reject", he/she can call
again within MaxDeltaT seconds and the call will be handled normally.
To configure the function use:
Accept call of 07142980031 if size for 2:2474/405>=100KB or 2nd call within
30 seconds:
Or/And AKA [3..5D] MinSize[KB] MaxDeltaT[s] Phone
ConditionalPoll Or 2:2474/405 100 30 07142980031
Accept call of 07142980032 if (size for 2:2474/403>=20KB or 2nd call within
30 seconds) *AND* (size for 21:492/4003 >= 10KB or 2nd call within 20s):
Or/And AKA [3..5D] MinSize[KB] MaxDeltaT[s] Phone
ConditionalPoll Or 2:2474/403 20 30 07142980032
ConditionalPoll And 21:492/4003 10 20 07142980032
Accept call of 07142980032 if (size for 2:2474/403>=100KB or 2nd call within
30 seconds) *OR* (size for 21:492/4003 >= 50KB or 2nd call within 20s):
Or/And AKA [3..5D] MinSize[KB] MaxDeltaT[s] Phone
ConditionalPoll Or 2:2474/403 100 30 07142980032
ConditionalPoll Or 21:492/4003 50 20 07142980032
You may configure up to 100 such ConditionalPoll lines. Dependant on your
ISDN adaptor and configuration, you maybe should leave out the leading "0"
(national calls) or "00" (intl calls).
To reject a call, define once:
Reject <Modem command string|>
For a ZyXEL Elite 2864I use:
Reject ATH1|ATH0|
For ELINK 310 use:
Reject AT\\K|
ATS21.2= (shows caller number after RING - tested with EPROM 1.36)
For ELINK 301 use:
Reject AT\\K| (since EPROM version 2.20 of 11.5.94)
AT\O5 (show caller number after RING, since v2.12)
Restriction for ELINKs: until a ROM is released which supports a "Call
rejected" response code, you will only be able to reject incoming calls, but
not to treat being rejected yourself (you will just receive "NO CARRIER" if
you are rejected). You may configure a very LOW MaxDeltaT value to handle
this (not nice, but possible) - see also binkley event file A= parameter. But
your links should be aware that they will flag you undialable if they dial
too often without getting a connection.
CE: New keyword "ModemReject" to identify a rejection response from the modem.
CE: New keyword "AfterCallOut" to send an AT???-command to get a cause value
from ISDN adapters like ZyXEL 2864I.
There are two different ways to see if a call is rejected:
1) The ISDN adapter sends "Busy/Cause=34Be" in one line.
2) You send an AT??? command and get an answer like "Cause = Call reject".
For 1) you need only "ModemReject <Rejectstring>", for 2) you need the
Rejectstring and "AfterCallOut <Lines> <AT command>".
AfterCallOut needs a number of lines (of output caused by AT command) and an
AT command which leads to a report with the cause value.
After a rejected outbound call, all mail to this AKA will change to NORMAL
flavour. Now you have an easy way to ping your Uplink, if he knows the
feature of Freepoll<tm>/ConditionalPoll.
ModemReject will only work with automatic call not with manual calls!
For ZyXEL 2864I i use "AfterCallOut 9 ATI3|" and "ModemReject Call reject".
For CFOS you need only "ModemReject /Cause=34Be". For ELINK, there is no such
possibility until now.
MT: New config verb "ReInitTime"
This lets you specify the time between modem initializations.
ReInitTime 10 -> init the modem every 10 minutes. Valid range for this
setting is 1 .. 10 only.
If you specify 0, you will get 1 minute. If you specify >10, you will get 10
minutes. This is due to a restriction in BT's timer routine and may be
removed in a later version of BT-XE.
MT: New config verb "ReadHoldTime"
This lets you specify the time between automatic outbound rescans.
ReadHoldTime 10 -> rescan outbound 10 minutes. Valid range is 1...
MT: Support for external request processors (ERPs) with SRIF
To use this, specify in Binkley.Cfg:
SRIF e:\maxfrq\maxfreq $s
The $s parameter will be replaced by the SRIF filename by BT-XE. The SRIF
file will be called "SRIF.Txx", xx=TaskNumber in Hex.
Known limitations:
The external SRIF erp is only invoked in an EMSI/WaZOO session. Also when
JANUS is used, the SRIF ERP is not invoked. This may be changed in the near
future.
The generated SRIF is compatible with the SRIF 1.01 Standard. But not all of
the optional statements are included.
I tried it also with MaxFreq 1.00 wb2 ERP only, so i cannot guarantee that
also other ERPs work with Binkley.
MaxFreq needs in his config a Mailer statement. Since it is not (yet) allowed
to specify Binkley, i use Cantaloup };->=>
Have much fun, and please test carefully.
HR: New config verb "ShowAlive"
Generates a file I_ALIVE.xx (xx=Tasknumber) in the "Flags" directory. If the
file exists, nothing is done except checking it for existance. If it does not
exist, it will be created by BT-XE.
Check for existance is done each minute. So external programs can check if
BT-XE is alive by deleting this flag file and waiting if it is re-created in
a minute. If BT-XE terminates, it deletes the flag file itself.
HR: Enhanced user dialogue with Alt-G (get file[s])
BT-XE will show destination system name after you entered dest address.
HR: Enhanced user dialogue with Alt-S (send file[s])
BT-XE will show destination system name after you entered dest address. If
you enter a wildcard filename, it will use the first matching file. If no
(matching) file is found, Alt-S remains in filename input mode and you can
try again. No unrecognized typos any longer!
With Win32 version of BT-XE, "\" works with german Windows NT, too.
HR: Enhanced user dialogue with Alt-S/Alt-G
After asking "More requests"/"More sends", the same address is used again if
you answer "y". To specify a new address, enter "o" for (o)ther node.
HR: Enhanced user dialogue with Alt-S (send file[s])
Support filename expansion like 4OS2/4DOS using TAB for expansion.
Example: type on my machine: c:\d<TAB>\bi<TAB>\HR<TAB><TAB>
get on my machine: c:\dowork\binkley\HR0418021.DOC
MMP: Implemented support for environment variables
If a sequence of letters, digits, and underscores are enclosed between %'s,
it is no longer handled as a comment, but as an environment variable.
Otherwise, % is still handled as a comment. Also, the configuration file
parser now allows configuration verbs to be indented. (TJW had implemented
support for environment variables, too).
MMP: Conditional inclusion of lines based on the task number
If a line begins with a decimal number, it is compared with the task number
as set by the TASK environment variable (e.g. TASK=n on command line). This
somehow offers the same functionality as [Common] and [Task n], but is
simpler to use for single line differences.
Example: 1 Init |AT&FZ|
3 Init ATZ|~~ATH0S27=17|
MMP: Added new keyword "PutEnv"
If this is used, there string following it is put into the environment.
Variables set in this way will be visible to Binkley itself, and by programs
spawned by it; e.g. SPAWNBBS.CMD.
Example: PutEnv BBSHOME=f:\bbs
PutEnv PATH=%BBSHOME%;%BBSHOME%\bin;%PATH%
StatusLog %BBSHOME%\bt\bt%TASK%.log
CostLog %BBSHOME%\bt\costlog%TASK%.log
MMP: "SpawnInit" keyword
This keyword specifies a command that should be executed as part of the
first-time initialization.
Example: SpawnInit su %PORT% lock %BAUD%
The command is executed only once, in the moment when the command is
encountered in the configuration file. Binkley does not even store the
command in memory. This keyword can save you for a batchfile, and can use
environment variables set in the configuration file.
You may use multiple SpawnInit commands to start multiple commands.
Attention: Do *NOT* use SpawnInit to directly run processes which stay
resident - this can cause file handle inheritance problems.
See also options of OS/2's "start" command.
MMP: "MailFlag" keyword
If this is specified in the configuration file (no arguments), and "Flags" is
also specified, Binkley will create a file called "BTMAIL.IN" in the flags
directory when mail has been received.
MMP: "TimeSync" keyword
Followed by an address and a MaxDeltaTSeconds value, it specifies that the
clock should be set to after an EMSI session (without password error) with
the node specified (using TRX) - if the time difference is not more than
MaxDeltaTSeconds seconds.
Example: TimeSync 2:238/28 60
So time will get synced to time of 2:238/28, but only if difference is within
60 seconds to our own time.
Tip: setting MaxDeltaTSeconds to e.g. 3700 (more than 1 hour) lets you do
summer / winter time zone switching automatically.
MMP: "LocalLog" keyword
If this keyword is specified (no arguments), Binkley will write its log
information (both the normal log, and the cost log) to a log file in the same
directory as BINKLEY.Dxx etc. When Binkley exits, and at the end of a
session, Binkley will move the contents of the local file to the file
specified in the configuration file, but only if it is able to. The log file
specified in the configuration file will no longer be continiously opened by
Binkley, and can safely be accessed by other programs. If Binkley is not able
to write to the specified log file, the log entries just stays put in the
local file until Binkley is able to move it. The local log files are called
(xx is the task number):
BINKLEY.Cxx (Local Cost Log)
BINKLEY.Lxx (Local Status Log)
MMP: "Respawn" command line argument
If this is specified, Binkley is automatically respawned in the unexpected
event that Binkley would trap (memory access violations etc). This wan't work
on DOS, but does under OS/2, and may work with other real operating systems
too.
The way this is accomplished is quite simple: We now have two processes
running for each Binkley. The first Binkley process spawns the other, the
normal Binkley, and monitors if it exits regularly. If so, the first Binkley
terminates itself with the errorlevel of the second Binkley. If not, it just
respawns the second Binkley.
The mechanism requires that the environment variable _BINKLEY_EXIT_ is _NOT_
set when Binkley is initially started. Binkley checks if this variable is
set, and if so, assumes it is the second (normal) Binkley. If it is not set,
Binkley will set it itself, and spawn the second Binkley. _BINKLEY_EXIT_ is
set to the filename BINKxxxx.XIT, where xxxx is the first Binkley's process
ID. The second Binkley creates this file on a normal exit, and the first
Binkley checks if it can delete it. If not, it didn't exist, and the normal
Binkley must have died irregularly.
MMP: Environment variables on command line
Implemented TW's idea of setting environment variables on the command line.
If an argument contains a '=', it is put into the environment.
Example: bt32 TASK=3
Remark of TW: The TASK=n argument on BT32.EXE command line is a MUST HAVE in
this version of BT-XE ! Don't use TaskNumber in Binkley.Cfg!
You MUST change your BAT / CMD files !!!
MMP: Built the language file into the EXE file
If there is no language file, Binkley now reads the language file from the
EXE itself. The language is simply appended to the EXE followed by the file
size (two bytes). BTLNG now can do this.
Example: btlng32 patch bt32.exe binkley.lng
Attention: You should NOT use an old *.LNG file nor an *.LNG file at all if
you want to have standard (english) messages - they are built-in
in the EXE now!
MMP: "ShortCostLog" keyword
Binkley's costlog contains a log of useful information that easier to monitor
than the status log. However, this log is ment for human reading, and not
very easily handled with utilities like grep, awk, (REXX?) etc. So i have
invented a ShortCostLog keyword. If it is used, the CostLog will be written
in another format. The argument to ShortCostLog is a format string specifying
this format. The format string can contain literal characters and macros. A
macro is prefixed with '$', followed by an optional length, and ended with a
character specifying what kind of information to write. If the optional
length begins with '0', the information is zero-padded; otherwise it is
space-padded. The following macros are defined:
$# TaskNumber
$$ The $ character
$< Newline
$A Node address
$B Baud rate
$C Size of biggest file sent or received
$D Seconds used to transmit biggest file ($C)
$E Total number of errors
$H Hour
$I Number of inbound files
$J CPS of inbound files
$M Minute
$O Number of outbound files
$P CPS of outbound files
$S Second
$T Total number of files
$U Total CPS
$V Size of biggest file received
$W Seconds used to receive biggest file ($V)
$X CPS of biggest file received ($V)
$Y CPS of biggest file send or received ($C)
$b Abbreviated month
$c Cost
$d Day of month
$f Number of errors when receiving files
$g Number of errors when transmitting files
$i Size of inbound files
$j Efficiency of inbound files
$m Month
$o Size of outbound files
$p Efficiency of outbound files
$s Seconds of session
$t Total size of files
$u Total efficiency
$v Size of biggest file sent
$w Seconds used to send biggest file ($v)
$x CPS of biggest file sent ($v)
$y Year without century
The format string can be left out in which case it defaults to:
$02y$02m$02d $02H$02M$02S $# $14A $6B $4s $4c $8i $8o $8C $4Y
Which produces log entries like: (removed unnecasary spaces)
Biggest file
Date Time Task Node Connect Sec Cost In Out -size -cps
960328 132222 1 2:238/9 28800 29 0 6036 9903 9896 3298
960328 132539 1 2:238/54 28800 105 0 0 230517 223554 3287
You can also use ShortCostLog to produce comma separated files which can be
imported directly into a spreadsheet or a database.
TJW: OS/2 only: Activated priority control
The originally released EXE didn't control priority, but worked EVER at
priority Normal/0. This is too low, if you have other "heavy" processes
running on your system. ISDN transfer rates dropped to below 5000 CPS in such
cases (normal: 7000..7800 CPS) on my system (P133,32MB).
I set the appropriate compiler switch and re-activated the priority control.
Also, I enhanced priority control via environment variables.
You may now influence priorities using these environment variables:
This is the default: This is as without priority control:
SET REGULARPRIORITY=R31 SET REGULARPRIORITY=R0
SET MODEMPRIORITY=F15 SET MODEMPRIORITY=R0
SET JANUSPRIORITY=T31 SET JANUSPRIORITY=R0
SET HYDRAPRIORITY=T31 SET HYDRAPRIORITY=R0
Syntax: ...PRIORITY=<class>[delta]
class: R = Regular (2)
F = Foregroundserver (4)
T = TimeCritical (3)
delta: 0 = normal
..
31 = high (default, if not specified)
Do experiments with these values! The defaults needn't to be the best values
for YOUR system and high priority needn't be better than low priority.
TJW: The BINKLEY.DAY and .SCD are renamed to BINKLEY.Dxx and .Sxx
(xx=TaskNumber).
TJW: Multiline configuration via single Binkley.Cfg and Binkley.Evt files!
[Common] and [Task x] in single Binkley.Cfg / .Evt make multiline operation
possible with one single Cfg and one single Evt file.
You needn't use this nice feature if you don't want to. Operation should be
possible with the same config / event files as in orig. BT 2.60 release
without usage of these "sections", because the implicit default section at
top of each config file read (or included) is "[Common]".
BUT: you MUST use TASK=n commandline argument in ANY case.
[Common]
; settings in this section are read by all tasks.
; ...
[Task 1]
; settings in this section are read by Task 1 only.
; all other tasks ignore these settings like if they were "blind" ...
[Task 2]
; settings in this section are read by Task 2 only.
; all other tasks ignore these settings like if they were "blind" ...
[Common]
; settings in this section are read by all tasks.
; ...
If you specify a setting first in [Common] and afterwards the same setting in
[Task x] (or vice versa), behaviour of BT-XE in Task x is the same as if you
specified these settings twice in this order using original BT 2.60.
If you include another config file using "Include" statement, state (read
settings or not) is treated locally to each file and restored after return
from reading that file.
E.g.:
[Common]
; settings here are common for all tasks
Include Task1.Cfg <- may have [Task x] and [Common] sections, too.
; settings here are common for all tasks, regardless of Task1.Cfg contents.
TJW: Using TaskNumber for BBS/EXT exits
This is now handled like in Binkley 2.60 release (again). Review your CMD /
BAT files if you used former BT-XE versions !!!
BBS exits:
%1 %2 %3 %4 %5
DTErate ConnectRate COMhandle Time2NextEvent Modem-String
EXT exits:
%1 %2 %3 %4 %5 %6
DTErate ConnectRate COMhandle Time2NextEvent n Modem-String
This is NORMAL Binkley parameter layout again (no additional parameter as in
former betas of BT-XE). If you need the TaskNumber in this context, just get
it out of %TASK% environment variable (which is defined by BT-XE if you
invoke it with BT32.EXE TASK=n).
TJW: "Hydra1st" config verb
Behaviour without Hydra1st: Standard - like until now. If a caller says to be
able to do Janus, he will get Janus protocol -
even if he could also do Hydra.
Behaviour with Hydra1st: Hydra is preferred. If a caller says to be able
to do Hydra, he will get Hydra protocol - even if
he could also do Janus.
TJW: Enhanced Screen Layout / Colours:
- Extended colour settings (like BT-EE now! ;-) There are 2 more colours
(configured after the normal 2.60 colours) now for windows frame title text
and frame colour. See sample configs ...
- TaskNumber in top left corner
- Port and Baud switched position
- broader Recent Activity and Hold Window
- with mail "Age" display in Hold Window
- one screen row more than before (there are 25, not 24). Therefore one row
more in Recent Activity window.
TJW: Implemented "MakeDir" config verb
This creates outbound directories needed for BSY flags. Also, it removes
empty outbound directories.
TJW: RecentyActivity-Buffer is saved to and restored from disk file
Binkley.Axx.
Back to What's new in BinkleyTerm XE? or to Index