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
Maintained by the BTXE-Team last modified: May, 05 2000