====[ Fixes to RBBS-PC 17.4  ]========

Last Mod:  KG022502

Note:  BASE is RBBS 17.4

CONVENTIONS:
    The changes are assigned numbers that  correspond  to  the
    month,  day, and order in which they were made.  Any mods
    are dated following the modification  description.   The
    lines   of   source   code  that  are  changed/modified/added  are
    designated by the comment beginning in column 70 of "' iiMMDDnn"
    where ii is the initials of the person providing the change
    and nn is the number of the change (01, 02, ...).

Latest Downloadable Fixes:  RFIX0312.ZIP
-------------------------------------------------------------------
RBBS-PC.EXE         06-21-92   9:00 PM EST  Release of 17.4
--------------------------------------------------------------------
                            Summary

EXE   MOD       Short Description
---- --------   -----------------
RBBS RM030801  Untrapped error possible when max time to bank > 255
RBBS RM030201  SysOp allowed to leave msg to a number without warning
RBBS KG031101  Delete in msg edit now accepts "-" for ranges
DOC  KG030901  Nested sub-options not working in bulletins
RBBS KG022502  Possible to get main security updated from change in subboard
RBBS KG022501  Auto-logoff for inactivity not working at msg "to" prompt
RBBS KG020801  Makes it clearer how to skip a linked conference
RBBS DR020301  Sometimes getting msg read command carry over
RBBS KG020501  Supports separately shelling/dooring for protocol up/download
RBBS KG020201  Sometimes getting out of memory error
RBBS KG013002  Possible to get endless loop when bulletin since and none
RBBS KG013001  Ques on continue to linked conf aborts or rolls to next
RBBS KG012803  W)ho not showing line speed when caller is in a door
RBBS KG012802  Global read sometimes not working
RBBS KG012801  Adds support for turbo logon in Join command
RBBS KG012601  Possible for W)ho command to report incorrect # of nodes
RBBS KG012502  A)ll option on who to offered when won't be accepted
RBBS KG012501  CONFMAIL.DEF file being left open, making hard to change
RBBS KG012401  Lets select any bulletins when asks about new ones
RBBS KG012301  Stacked commands not working right on conf join
RBBS KG012001  In who command, show line speed
RBBS KG011501  Don't automatically show menu when no such entry found
RBBS KG011201  Allow CR's and message entry to be stacked in macros
RBBS KG100701  Subboard allowed to change network type
RBBS KG092301  Makes macros tolerate whether in turbo key mode
RBBS KG092201  Records Line Speed that RBBS uses
RBBS KG091002  Makes code more tolerant when reading FMS directories
RBBS KG091001  Allows download personal files to be viewed
RBBS KG082201  Lets SysOp make pers upload to a security level
RBBS KG082101  Possible for caller to regain banked time
RBBS KG070401  UTIL.HLP refers to "B)aud change" not "B)ank time"
RBBS RH070402  Get untrapped error when timeout looking at callers file
RBBS RH070401  Possible for activity to be logged to wrong callers file
RBBS BH070401  [CBAUD] sometimes not working with external protocol
RBBS KG062401  Unable to download marked files in personal directory
RBBS KG062301  Msg scan/topic scan not operating same as Read

Contributors include:

     BH - Bob Hampton
     DR - Dan Rowe
     KG - Ken Goosens
     RH - Ray Horton
     RM - Richie Molinelli

------------------------[ RM030801]-------------------------

Problem:  If the SysOp puts in a max time to bank larger than 255
into the passwrds file, an untrapped error can occur.  This is rare
only because few SysOps permit a session time greater than 255 minutes.

Solution:  Change RBBSSUB5.BAS as follows:

63659 ZErrCode = 0
      IF ZTempMaxBank > 255 THEN _                                   ' RM030801
         ZTempMaxBank = 255                                          ' RM030801
      END SUB

------------------------[ RM030201]-------------------------

Problem:  It is possible for a SysOp to leave a message to a security
level without any check whether a person exists with the number as
a name.

Change RBBS-PC.BAS as follows:

20205 ZFileSysParm = 0                                               ' RM030201
      RETURN

Change RBBSSUB2.BAS as follows:

2032 RcvrRecNum = 0
     IF MsgTo$ <> "ALL" OR NOT AllowPub THEN _                       ' KG012502
        IF ((LEFT$(MsgTo$,4) <> "ALL " OR NOT AllowPub) AND ZStartHash = 1) THEN _ ' KG012502
           CALL CheckInt (MsgTo$) : _                                ' KG082201
           IF ZTestedIntValue = 0 OR NOT ZSysOp OR (ZSysOp AND ZFileSysParm < 1) THEN _ ' RM030201
              ZWasDF = INSTR(MsgTo$+" @"," @") : _
              TempHashValue$ = LEFT$(MsgTo$,ZWasDF-1) : _
              CALL WhoCheck (TempHashValue$,Found,RcvrRecNum) : _
              IF NOT Found THEN _
                 ZLastIndex = 0 : _
                 RcvrRecNum = 0 : _
                 IF NOT ZReply THEN _
                    ZOutTxt$ = "Send anyway (Y,[N])" : _
                    ZTurboKey = -ZTurboKeyUser : _
                    ZLastIndex = 0 : _
                    GOSUB 2034 : _
                    IF NOT ZYes THEN _
                       GOTO 2021
     IF MsgTo$ = Temp$ THEN _
        ZOutTxt$ = "Really send this to YOURSELF (Y,[N])" : _
        ZLastIndex = 0 : _
        GOSUB 2034 : _
        IF NOT ZYes THEN _
           MsgTo$ = ""
     CALL OpenWorkA (ZNodeWorkFile$)
     CALL PrintWorkA (MsgTo$ + "," + STR$(RcvrRecNum))
     CLOSE 2
     ZNumHeaders = ZNumHeaders + 1
     IF EnableCC AND (NOT ZReply) AND MsgTo$ <> "ALL" AND _
        MsgTo$ <> "" AND LEFT$(MsgTo$,4) <> "ALL " AND _
        (NOT ZSysopComment) AND (NOT ZSysopMsg) THEN _
           ZOutTxt$ = "Carbon copy to another (Y,[N])" : _
           CALL PopCmdStack : _
           IF ZYes THEN _
              GOTO 2021

------------------------[ KG031101]-------------------------

Enhancement:  When deleting lines in message edit, you can now use
"-" to indicate range, as in "d 3-4" and "d 10 - 15".

Change RBBS-PC.BAS as follows:

2500 ZOutTxt$ = "Delete from"
     GOSUB 3300
     Mark1 = ZTestedIntValue
     IF ZAnsIndex < ZLastIndex AND ZUserIn$(ZAnsIndex+1) = "-" THEN _ ' KG031101
           ZAnsIndex = ZAnsIndex + 1 _                               ' KG031101
     ELSE Temp = INSTR(ZUserIn$(ZAnsIndex),"-") : _                  ' KG031101
             IF Temp > 0 AND Temp < LEN(ZUserIn$(ZAnsIndex)) THEN _  ' KG031101
                ZUserIn$(ZAnsIndex) = MID$(ZUserIn$(ZAnsIndex),Temp+1) : _ ' KG031101
                ZAnsIndex = ZAnsIndex - 1                            ' KG031101

------------------------[ KG030901]-------------------------

Problem:  When have a bulletin submenu called say "PAC" and bulletin
prefix, say "B", then "BPAC.MNU" is a sub-menu.  If you then pick say
options 1,2,...,5, that should pick off a file to display called
BPAC1,...,BPAC5 but nothing displays.

Solution:  Sub-options to display must in 17.4 be terminated with a
"-".  So rename the options BPAC1-,...,BPAC5- and they will work.
The docs with 17.4 are incorrect and did not reflect this change
in either the section on shared sub-options or in the section on
converting to 17.4 from earlier versions.

------------------------[ KG022502]-------------------------

Problem:  When subboard has a questionnaire that updates the
user's security, this new security carries over into main user
file when logs off in the subboard.

Solution:  Change RBBSSUB2.BAS as follows:

10605 LSET ZUserDnlds$ = MKI$(ZDnlds)
      LSET ZUserUplds$ = MKI$(ZUplds)
      IF ZEnforceRatios THEN _
         LSET ZTodayDl$ = MKS$(ZDLToday!) : _
         LSET ZTodayBytes$ = MKS$(ZBytesToday!) : _
         LSET ZDlBytes$ = MKS$(ZDLBytes!) : _
         LSET ZULBytes$ = MKS$(ZULBytes!)
      CALL CheckTime (ZUserLogonTime!, ZSecsUsedSession!, 2)
      IF (NOT ZExitToDoors) AND LoggingOff THEN _
         TempElapsed! = ZElapsedTime + _
                       (ZSecsUsedSession! - ZTimeCredits!) / 60 : _
         ZTimeCredits! = 0 _
      ELSE TempElapsed! = ZElapsedTime - ZExitToDoors*ZMinsInDoors
      IF TempElapsed! < -32767 THEN _
         TempElapsed! = -32767 _
      ELSE IF TempElapsed! > 32767 THEN _
         TempElapsed! = 32767
      LSET ZElapsedTime$ = MKI$(TempElapsed!)
      IF ZAdjustedSecurity THEN _
         LSET ZSecLevel$ = MKI$(ZUserSecLevel)
      PUT 5,ZUserFileIndex
      ZSubParm = 8
      CALL FileLock
      IF ZActiveUserFile$ <> ZOrigUserFile$ AND LoggingOff THEN _
         ZActiveUserFile$ = ZOrigUserFile$ : _
         ZUserFileIndex = ZOrigUserFileIndex : _
         UpdateDefaults = ZFalse : _
         ZAdjustedSecurity = ZFalse : _                              ' KG022502
         LSET ZLastDateTimeOn$ = ZOrigDateTimeOn$ : _
         GOTO 10602

------------------------[ KG022501]-------------------------

Problem:  When at "To" prompt in message entry and timeout for inactivity,
then asks user if wants really to send message rather than logging off\
immediately.

Solution:  Change RBBSSUB2.BAS as follows:

2021 ZOutTxt$ = "To " + LEFT$("A)ll,",-5*AllowPub) + "(S)ysop," + _  ' KG012502
                 LEFT$("D)istribution,",-14*EnableCC) + _
                 " or name" + ZPressEnterExpert$
     CALL SkipLine (1)
     ZSemiOnly = ZTrue
     CALL PopCmdStack
     IF ZWasQ = 0 OR ZSubParm < 0 THEN _                             ' KG022501
        GOTO 2033                                                    ' KG022501
     IF LEN(ZUserIn$(ZAnsIndex)) > 30 THEN _
        CALL QuickTPut1 ("30 Char. Max") : _
        GOTO 2021
     Found = ZTrue                                                   ' KG022501
     ZWasDF$ = ZUserIn$(ZAnsIndex)                                   ' KG022501
     CALL AllCaps (ZWasDF$)                                          ' KG022501
     ZUserIn$(ZAnsIndex) = ZWasDF$                                   ' KG022501
     IF ZWasDF$ = "A" AND AllowPub THEN _                            ' KG022501
        MsgTo$ = "ALL" _                                             ' KG022501
     ELSE IF ZWasDF$ = "S" THEN _                                    ' KG022501
        MsgTo$ = "SYSOP" _                                           ' KG022501
     ELSE IF ZWasDF$ = "D" AND EnableCC THEN _                       ' KG022501
        GOTO 2025 _                                                  ' KG022501
     ELSE MsgTo$ = ZUserIn$(ZAnsIndex) :_                            ' KG022501
          CALL AllCaps (MsgTo$)                                      ' KG022501
     GOTO 2032

------------------------[ KG020801]-------------------------

Problem:  When prompted whether to continue to a linked conference,
it is not clear than answering No will skip to the next linked
conference.

Solution:  Replace N with S)kip.  Change RBBSSUB5.BAS as follows:

63616 EndConf = INSTR(ZLinkedConf$,ZCarriageReturn$)                 ' KG013001
      LastConf = (EndConf = LEN(ZLinkedConf$))                       ' KG013001
      ZHomeConf$ = LEFT$(ZLinkedConf$,EndConf-1)
      IF ZNonStop THEN _
         CALL QuickTPut1 ("Joining linked conference " + ZHomeConf$) _
      ELSE _
         ZOutTxt$ = "Continue to linked conference " + ZHomeConf$ + " ([Y],S)kip,A)bort)" : _ ' KG020801
         CALL DeLink (ZHomeConf$) : _                                ' KG013001
         ZTurboKey = -ZTurboKeyUser : _
         ZSubParm = 1 : _
         CALL TGet : _
         IF ZWasQ > 0 AND NOT ZYes THEN _                            ' KG020801
            ZWasX$ = ZUserIn$(1) : _                                 ' KG013001
            CALL AllCaps (ZWasX$) : _                                ' KG013001
            ZLinkedConf$ = ZLinkedConf$ + ZHomeConf$ + ZCarriageReturn$ : _ ' KG013001
            IF LastConf OR ZWasX$ = "A" THEN _                       ' KG013001
               ZHomeConf$ = ""  : _                                  ' KG013001             ' KG013001
               ZGlobalRead = ZFalse : _                              ' KG013001
               EXIT SUB _                                            ' KG013001
            ELSE GOTO 63616                                          ' KG013001
      END SUB

------------------------[ DR020501]-------------------------

Problem:  When stacking a msg command like "g" for global, sometimes
it carries over after the read and is misinterpreted as a command
at the main command line.

Solution:  Change RBBS-PC.BAS as follows:

4415 Forward = ZFalse
     Reverse = ZFalse
     FOR WasI = ZAnsIndex to ZLastIndex
        IF INSTR("Gg",ZUserIn$(WasI)) > 0 THEN _
           GOSUB 4640                                                ' KG020201
     NEXT
     IF ZAnsIndex <= ZLastIndex OR LEN(ZUserIn$(ZAnsIndex)) = 1 THEN _ ' DR020301
        IF INSTR("Ss*",ZUserIn$(ZAnsIndex)) > 0 THEN _
           CurMsg = ZLastMsgRead + 1 : _
           Forward = ZTrue : _
           GOTO 4430 _
        ELSE IF INSTR("Ll",ZUserIn$(ZAnsIndex)) > 0 THEN _
                CurMsg = HighMsgNumber : _
                Reverse = ZTrue : _
                GOTO 4490 _
        ELSE IF INSTR("Gg",ZUserIn$(ZAnsIndex)) > 0 THEN _
                ZGlobalRead = ZTrue : _
                GOTO 4370

------------------------[ KG020501]-------------------------

Enhancement:  may want to door on uploads but shell on downloads.
This lets you put two letters in proto.def for method to use.
First applies to downloads, second to uploads.  If only one letter
is used, it applies to both.  "SD" means shell on download and
door on uploads.

Change RBBSSUB3.BAS as follows:

21623 CALL ReadParms (ZWorkAra$(),13,ZFF)
      IF ZErrCode > 0 THEN _
         ZFF = LEN(ZDefaultXfer$) : _
         ZProtoPrompt$ = "None" : _
         GOTO 21625
      ZProtoPrompt$ = ZWorkAra$(1)
      IF LEN(ZProtoPrompt$) > 2 THEN _
         IF MID$(ZProtoPrompt$,2,1) = ")" THEN _
            ZProtoPrompt$ = LEFT$(ZProtoPrompt$,1) + MID$(ZProtoPrompt$,3)
      WasX = INSTR(ZProtoPrompt$+ZCrLf$,ZCrLf$)
      ZProtoPrompt$ = LEFT$(ZProtoPrompt$,WasX-1)
      CALL Trim (ZProtoPrompt$)
      ZProtoMethod$ = ZWorkAra$(3)                                   ' KG020501
      CALL AllCaps (ZProtoMethod$)
      ZReq8Bit = (LEFT$(ZWorkAra$(4),1) = "8")
      ZDownTemplate$ = ZWorkAra$(12)
      ZUpTemplate$ = ZWorkAra$(13)
      WasX$ = ZWorkAra$(11)
      WasX = INSTR(WasX$,"=")
      ZAdvanceProtoWrite = ZFalse
      IF WasX < 2 OR WasX >= LEN(WasX$) THEN _
         ZFailureParm = 4 : _
         ZFailureString$ = "F" _
      ELSE ZFailureParm = VAL(LEFT$(WasX$,WasX-1)) : _
           ZFailureString$ = MID$(WasX$,WasX+1) : _
           WasX = INSTR(ZFailureString$,"=") : _
           IF WasX > 0 THEN _
              ZAdvanceProtoWrite = (MID$(ZFailureString$,WasX) = "=A") : _
              ZFailureString$ = LEFT$(ZFailureString$,WasX-1)
      ZProtoMacro$ = ZWorkAra$(10)
      ZFakeXRpt = (LEFT$(ZWorkAra$(8),1) = "F")
      ZBatchProto = (LEFT$(ZWorkAra$(6),1) = "B")
      ZSpeedFactor! = VAL(ZWorkAra$(9))
      IF ZSpeedFactor! < 0.1 THEN _
         ZSpeedFactor! = 0.87
      ZBlockSize = VAL(ZWorkAra$(7))
      ZFLen = ZBlockSize
      IF ZFLen < 1 THEN _
         ZFLen = 128

Change RBBSSUB4.BAS as follows:

62624 ' $SUBTITLE: 'PrivDoorRtn - subroutine to exit as a private door.'
' $PAGE
'
'  NAME    -- PrivDoorRtn
'
'  INPUTS  --     PARAMETER                    MEANING
'              ZTransferFunction         = 1 DOWNLOAD FILE TO USER
'                                        = 2 UPLOAD FILE TO RBBS-PC
'                                        = 3 USER REGISTRATION PGM
'              ZUserIn$                      NAME OF FILE TO EXIT TO
'              ZComPort$                 NAME OF COMMUNICATIONS PORT
'                                        TO BE USED BY KERMIT (COM1
'                                        OR COM2)
'              ZBPS                      = -1 FOR   300 BAUD
'                                        = -2 FOR   450 BAUD
'                                        = -3 FOR  1200 BAUD
'                                        = -4 FOR  2400 BAUD
'                                        = -5 FOR  4800 BAUD
'                                        = -6 FOR  9600 BAUD
'                                        = -7 FOR 19200 BAUD
'
'  OUTPUTS -- NONE
'
'  PURPOSE -- To transfer control to another program
'
      SUB PrivDoorRtn STATIC
      IF ZPrivateDoor THEN _
         GOTO 62630
      IF ZFakeXRpt THEN _
         CALL FakeXRpt (ZWasFT$)
      IF ZAdvanceProtoWrite THEN _
         CALL OpenOutW ("XFER-"+ZNodeID$+".DEF") : _
         IF ZErrCode < 1 THEN _
            CALL PrintWorkA (ZFileName$+",,"+ZWasFT$) : _
            CLOSE 2
      IF (ZTransferFunction = 1 AND LEFT$(ZProtoMethod$,1) = "S") OR _ ' KG020501
         (ZTransferFunction = 2 AND RIGHT$(ZProtoMethod$,1) = "S") THEN _ ' KG020501
         GOTO 62629

------------------------[ KG020201]-------------------------

Problem:  Can get an out of memory error in line 4415.  Wrong line
number used.

Change RBBS-PC.BAS as follows:

4415 Forward = ZFalse
     Reverse = ZFalse
     FOR WasI = ZAnsIndex to ZLastIndex
        IF INSTR("Gg",ZUserIn$(WasI)) > 0 THEN _
           GOSUB 4640                                                ' KG020201
     NEXT
     IF ZAnsIndex <= ZLastIndex AND LEN(ZUserIn$(ZAnsIndex)) = 1 THEN _ ' KG013001
        IF INSTR("Ss*",ZUserIn$(ZAnsIndex)) > 0 THEN _
           CurMsg = ZLastMsgRead + 1 : _
           Forward = ZTrue : _
           GOTO 4430 _
        ELSE IF INSTR("Ll",ZUserIn$(ZAnsIndex)) > 0 THEN _
                CurMsg = HighMsgNumber : _
                Reverse = ZTrue : _
                GOTO 4490 _
        ELSE IF INSTR("Gg",ZUserIn$(ZAnsIndex)) > 0 THEN _
                ZGlobalRead = ZTrue : _
                GOTO 4370

------------------------[ KG013002]-------------------------

Problem:  When ask to read bulletins since (b s) and there are none,
get an endless loop because a continuation statement was left off
a statement.

Solution:  Change RBBS-PC.BAS as follows:

9760 ' ****  [entry when want review plus chance to read] *********
     GOSUB 9750
     IF NumNewBullets > 0 THEN _
        ZLastIndex = NumNewBullets + 1 : _
        ZOutTxt$ = "Read what new bulletins (A)ll,[Q]uit)" : _       ' KG012401
        GOSUB 12999 : _
        CALL AllCaps (ZUserIn$) : _                                  ' KG013002
        IF ZWasQ > 0 AND ZUserIn$ <> "Q" THEN _                      ' KG012401
           GOSUB 9761 : _                                            ' KG012401
           ZAnsIndex = 0 : _
           ZLastIndex = NumNewBullets : _
           GOTO 9700
     ZLastIndex = 0
     IF ZAnsIndex < 1 THEN _
        RETURN
     GOTO 9701

------------------------[ KG013001]-------------------------

Problem:  there is no good way to skip linked conferences in a global
read.

Solution: Let a)bort do the work of breaking the global read.  No then
just rolls over to the next conference, asking if caller wants to continue
to it.

Change RBBS-PC.BAS as follows:

4352 SearchString$ = ""
     DontPrint = ZFalse
     JustReplied = ZFalse
     QuotedReply = ZFalse
     CanKill = (ZSysop OR ZUserSecLevel >= ZSecKillAny)
     GOSUB 1893
     GOSUB 5344
     ZWasZ$ = ""
     FOR WasI = 2 TO ZLastIndex                                      ' KG012802
        IF INSTR("Ss*",ZUserIn$(WasI)) > 0 THEN _
           ZUserIn$(WasI) = MID$(STR$(ZLastMsgRead+1),2) + "+"
        IF INSTR("Ll",ZUserIn$(WasI)) > 0 THEN _
           ZUserIn$(WasI) = MID$(STR$(HighMsgNumber),2) + "-"
        IF INSTR("Gg",ZUserIn$(WasI)) > 0 THEN _
           GOSUB 4640                                                ' KG013001
     NEXT

4415 Forward = ZFalse
     Reverse = ZFalse
     FOR WasI = ZAnsIndex to ZLastIndex
        IF INSTR("Gg",ZUserIn$(WasI)) > 0 THEN _
           GOSUB 4415                                                ' KG013001
     NEXT
     IF ZAnsIndex <= ZLastIndex AND LEN(ZUserIn$(ZAnsIndex)) = 1 THEN _ ' KG013001
        IF INSTR("Ss*",ZUserIn$(ZAnsIndex)) > 0 THEN _
           CurMsg = ZLastMsgRead + 1 : _
           Forward = ZTrue : _
           GOTO 4430 _
        ELSE IF INSTR("Ll",ZUserIn$(ZAnsIndex)) > 0 THEN _
                CurMsg = HighMsgNumber : _
                Reverse = ZTrue : _
                GOTO 4490 _
        ELSE IF INSTR("Gg",ZUserIn$(ZAnsIndex)) > 0 THEN _
                ZGlobalRead = ZTrue : _
                GOTO 4370

4640 FOR WasJ = WasI to ZLastIndex-1                                 ' KG013001
        ZUserIn$(WasJ) = ZUserIn$(WasJ+1)                            ' KG013001
     NEXT                                                            ' KG013001
     ZGlobalRead = ZTrue                                             ' KG013001
     ZLastIndex = ZLastIndex - 1                                     ' KG013001
     RETURN                                                          ' KG013001

------------------------[ KG012803]-------------------------

Problem:  When caller is in a door, the who command shows part
of name of door in rather than the line speed. (Fix to an enhancement)

Solution:  Change RBBSSUB3.BAS as follows:

43070 ZActiveMessageFile$ = ZOrigMsgFile$
      ZSubParm = 3
      CALL FileLock
      CALL OpenMsg
      FIELD 1, 128 AS ZMsgRec$
      GET 1,ZNodeRecIndex
      IF ZGlobalSysop THEN _
         MID$(ZMsgRec$,1,30) = "SYSOP" + SPACE$(25)
      MID$(ZMsgRec$,40,2) = STR$(ZExitToDoors)
      MID$(ZMsgRec$,42,2) = STR$(ZEightBit)
      MID$(ZMsgRec$,44,2) = RIGHT$(STR$(-ZBPS),2)
      MID$(ZMsgRec$,46,2) = STR$(ZUpperCase)
      MID$(ZMsgRec$,48,5) = MKS$(ZNumDnldBytes!) + MID$(STR$(-ZBatchTransfer),2)
      MID$(ZMsgRec$,53,2) = STR$(ZWasGR)
      MID$(ZMsgRec$,55,2) = STR$(ZSysop)
      MID$(ZMsgRec$,65,3) = CHR$(VAL(LEFT$(ZOrigTimeLoggedOn$,2))) + _
                            CHR$(VAL(MID$(ZOrigTimeLoggedOn$,4,2))) + _
                            CHR$(VAL(MID$(ZOrigTimeLoggedOn$,7,2)))
      MID$(ZMsgRec$,72,2) = STR$(ZPrivateDoor)
      MID$(ZMsgRec$,74,1) = MID$(STR$(ZTransferFunction),2,1)
      MID$(ZMsgRec$,75,1) = ZWasFT$
      MID$(ZMsgRec$,113,2) = MKI$(CINT(ZTimeCredits!)/60)            ' KG012803
      MID$(ZMsgRec$,91,2) = STR$(ZReliableMode)
      CALL BreakFileName (ZCurPUI$,ZOutTxt$,ZUserIn$,ZWasZ$,ZFalse)
      MID$(ZMsgRec$,93,8) = ZUserIn$ + SPACE$(8 - LEN(ZUserIn$))
      IF ZLocalUser THEN _
         ZWasZ$ = ZCarriageReturn$ + ZCarriageReturn$ _
      ELSE ZWasZ$ = " 0"
      MID$(ZMsgRec$,101,2) = ZWasZ$
      MID$(ZMsgRec$,103,2) = STR$(ZLocalUserMode)
      ZConfName$ = LEFT$(ZConfName$,INSTR(ZConfName$ + " "," ") - 1)
      MID$(ZMsgRec$,105,8) = ZConfName$ + SPACE$(8 - LEN(ZConfName$))
      MID$(ZMsgRec$,115,1) = MID$(STR$(ZAutoLogoffReq),2,1)
      MID$(ZMsgRec$,117,2) = STR$(ZMenuIndex)
      MID$(ZMsgRec$,119,2) = LEFT$(DATE$,2)
      MID$(ZMsgRec$,121,2) = MID$(DATE$,4,2)
      MID$(ZMsgRec$,123,2) = RIGHT$(DATE$,2)
      MID$(ZMsgRec$,125,2) = LEFT$(TIME$,2)
      MID$(ZMsgRec$,127,2) = MID$(TIME$,4,2)
' ***   Save additional parameters for door restoral
      CALL OpenOutW (ZNodeWorkDrvPath$+"DRST"+ZNodeFileID$+".DEF")
      CALL PrintWorkA (STR$(ZLimitMinsPerSession))
      CALL PrintWorkA (ZWasNG$)
      CALL PrintWorkA (ZIndivValue$)
      CALL PrintWorkA (ZOrigDateTimeOn$)
      CALL PrintWorkA (ZOrigTimeLoggedOn$)
      CALL PrintWorkA (STR$(ZUserFileIndex))
      CALL PrintWorkA (ZUpldDir$)
      ZOutTxt$ = STR$(ZUpldDir$ = ZFMSDirectory$ OR ZLimitSearchToFMS)
      CALL PrintWorkA (ZOutTxt$)
      CALL PrintWorkA (ZCBaud$)
      CALL PrintWorkA (ZDooredTo$)                                   ' KG012803
      CLOSE 2

44000 ' $SUBTITLE: 'ReadProf - subroutine to restore a user profile'
' $PAGE
'
'  NAME    -- ReadProf
'
'  INPUTS  --     PARAMETER                    MEANING
'              ZNodeRecIndex               NODE RECORD TO USE
'              ZSysopPswd1$               Sysop'S PSEUDONYM 1
'              ZSysopPswd2$               Sysop'S PSEUDONYM 2
'
'  OUTPUTS -- USER'S OPTIONS AND COMMUNICATIONS PARAMETERS
'             UPON EXITING RBBS-PC TO A "DOOR"
'
'  PURPOSE -- Reset a user's options and communications parameters
'             that were saved in the node record when a user exited
'             to a "door" so that he is in the same status as when
'             he exited.
'
      SUB ReadProf STATIC
      FIELD 1, 128 AS ZMsgRec$
      GET 1,ZNodeRecIndex
      ZReliableMode = VAL(MID$(ZMsgRec$,91,2))
      MID$(ZMsgRec$,40,2) = "00"
      ZEightBit = VAL(MID$(ZMsgRec$,42,2))
      ZBPS = -VAL(MID$(ZMsgRec$,44,2))
      CALL CommInfo
      ZBaudTest! = VAL(MID$(ZBaudRates$,(-5 * ZBPS),5))
      ZUpperCase = VAL(MID$(ZMsgRec$,46,2))
      ZNumDnldBytes! = CVS(MID$(ZMsgRec$,48,4))
      ZBatchTransfer = (MID$(ZMsgRec$,52,1) = "1")
      ZWasGR = VAL(MID$(ZMsgRec$,53,2))
      HourLoggedOn$ = RIGHT$("0"+MID$(STR$(ASC(MID$(ZMsgRec$,65,1))),2),2)
      MinLoggedOn$  = RIGHT$("0"+MID$(STR$(ASC(MID$(ZMsgRec$,66,1))),2),2)
      SecLoggedOn$  = RIGHT$("0"+MID$(STR$(ASC(MID$(ZMsgRec$,67,1))),2),2)
      ZTimeLoggedOn$ = HourLoggedOn$ + _
                        ":" + _
                        MinLoggedOn$ + _
                        ":" + _
                        SecLoggedOn$
      ZTransferFunction = VAL(MID$(ZMsgRec$,74,1))
      ZWasFT$ = MID$(ZMsgRec$,75,1)
      ZTimeCredits! = 60!*CVI(MID$(ZMsgRec$,113,2))                  ' KG012803
      ZMenuIndex = VAL(MID$(ZMsgRec$,117,2))
      ZCurPUI$ = MID$(ZMsgRec$,93,8)
      CALL Remove (ZCurPUI$," ")
      IF ZCurPUI$ <> "" THEN _
         CALL BreakFileName (ZMainPUI$,ZOutTxt$,ZUserIn$,ZWasZ$,ZTrue) : _
         ZCurPUI$ = ZOutTxt$ + ZCurPUI$ + ZWasZ$
      ZCustomPUI = (ZCurPUI$ <> "")
      ZLocalUser = (MID$(ZMsgRec$,101,2) = ZCarriageReturn$ + ZCarriageReturn$)
      ZLocalUserMode = VAL(MID$(ZMsgRec$,103,2))
      ZHomeConf$ = MID$(ZMsgRec$,105,8)
      ZAutoLogoffReq = (VAL(MID$(ZMsgRec$,115,1)) <> 0)
      CALL Trim (ZHomeConf$)
      IF ZHomeConf$ = "MAIN" THEN _
         ZHomeConf$ = ""
      IF ZRequiredRings > 0 AND _
         INSTR(ZModemInitCmd$,"S0=255") THEN _
         COLOR 7,0,0 _
      ELSE COLOR ZFG,ZBG,ZBorder
      IF ZLocalUserMode THEN _
         GOTO 44003
      CALL SetBaud

44003 ZUserLogonTime! = VAL(HourLoggedOn$) * 3600! + _
                        VAL(MinLoggedOn$) * 60! + _
                        VAL(SecLoggedOn$)
      HourLoggedOn$ = ""
      MinLoggedOn$ = ""
      SecLoggedOn$ = ""
      IF ZMinsPerSession < 1 THEN _
         ZMinsPerSession = 3
      IF NOT ZEightBit THEN _
         OUT ZLineCntlReg,&H1A
      IF LEFT$(ZMsgRec$,7) = "SYSOP  " THEN _
         ZFirstName$ = ZSysopPswd1$ : _
         ZActiveUserName$ = ZSecretName$ _
      ELSE ZFirstNameEnd = INSTR(ZMsgRec$," ") : _
           ZLastNameEnd = INSTR(ZFirstNameEnd + 1,ZMsgRec$ + " ","  ") : _
           ZFirstName$ = LEFT$(ZMsgRec$,ZFirstNameEnd-1) : _
           ZLastName$ = MID$(ZMsgRec$,ZFirstNameEnd + 1,ZLastNameEnd - (ZFirstNameEnd + 1)) : _
           ZActiveUserName$ = MID$(ZFirstName$ + " " + ZLastName$,1,31)
      ZWasZ$ = ZFirstName$
      CALL OpenWork (2,ZNodeWorkDrvPath$+"DRST"+ZNodeFileID$+".DEF")
      CALL ReadDir (2,1)
      ZLimitMinsPerSession = VAL (ZOutTxt$)
      CALL ReadDir (2,1)
      ZWasNG$ = ZOutTxt$
      CALL ReadDir (2,1)
      ZIndivValue$ = ZOutTxt$
      CALL ReadDir (2,1)
      ZOrigDateTimeOn$ = ZOutTxt$
      CALL ReadDir (2,1)
      ZOrigTimeLoggedOn$ = ZOutTxt$
      CALL ReadDir (2,1)
      ZUserFileIndex = VAL(ZOutTxt$)
      CALL ReadDir (2,1)
      ZUpldDoor$ = ZOutTxt$
      CALL ReadDir (2,1)
      ZFMSDoor = VAL(ZOutTxt$)
      CALL ReadDir (2,1)
      ZCBaud$ = ZOutTxt$
      CALL ReadDir (2,1)                                             ' KG012803
      ZDooredTo$ = ZOutTxt$                                          ' KG012803
      CLOSE 2
      IF ZExitToDoors AND ZDooredTo$ <> "" THEN _                    ' KG012803
         CALL OpenWork (2,ZDoorsDef$) : _                            ' KG012803
         IF ZErrCode = 0 THEN _                                      ' KG012803
            CALL ReadParms (ZOutTxt$(),8,1) : _                      ' KG012803
            WHILE ZErrCode = 0 AND ZOutTxt$(1) <> ZDooredTo$ : _     ' KG012803
               CALL ReadParms (ZOutTxt$(),8,1) : _                   ' KG012803
            WEND : _                                                 ' KG012803
            IF ZOutTxt$(1) = ZDooredTo$ THEN _                       ' KG012803
               ZDoorSkipsPswd = (ZOutTxt$(6) <> "Y")                 ' KG012803
      ZErrCode = 0                                                   ' KG012803
      CALL DoorReturn
      END SUB

------------------------[ KG012802]-------------------------

Problem:  sometimes when request global read and have linked
conferences, never asks if want to join next linked conference.
This happens, for example, when stack the join, as in
"j sig r s g" as opposed to "r s g".

Solution:  Change RBBS-PC.BAS as follows:

4352 SearchString$ = ""
     DontPrint = ZFalse
     JustReplied = ZFalse
     QuotedReply = ZFalse
     CanKill = (ZSysop OR ZUserSecLevel >= ZSecKillAny)
     GOSUB 1893
     GOSUB 5344
     ZWasZ$ = ""
     FOR WasI = 2 TO ZLastIndex                                      ' KG012802
        IF INSTR("Ss*",ZUserIn$(WasI)) > 0 THEN _
           ZUserIn$(WasI) = MID$(STR$(ZLastMsgRead+1),2) + "+"
        IF INSTR("Ll",ZUserIn$(WasI)) > 0 THEN _
           ZUserIn$(WasI) = MID$(STR$(HighMsgNumber),2) + "-"
        IF INSTR("Gg",ZUserIn$(WasI)) > 0 THEN _
           ZGlobalRead = ZTrue
     NEXT

------------------------[ KG012801]-------------------------

Enhancement.  Lets user elect to make a join a turbo logon.  Just
stack the "!" after the conference to join.  Thus, "j sig ! r s"
says to turbo logon into conference "sig", reading since.   This lets
the caller stack commands that will work regardless of whether there
is news, new bulletins, new files, etc.

Change RBBS-PC.BAS as follows:

5323 IF ZWasZ$ = "MAIN" THEN _
        ZWasZ$ = "M"
     WasX = (ZWasZ$ = "M")
     IF ZWasZ$ = ConfNameSave$ OR (WasX AND ZConfName$ = "MAIN") THEN _
        CALL QuickTPut1 ("You are already in " + ZWasZ$) : _
        RETURN
     IF ZUserIn$(ZAnsIndex+1) = "!" AND ZAnsIndex < ZLastIndex THEN _ ' KG012801
        TurboLogon = ZTrue : _                                       ' KG012801
        ZAnsIndex = ZAnsIndex + 1                                    ' KG012801
     ON INSTR("MNSPQ",ZWasZ$) GOTO 5350,5290,5292,5294,10550
     IF NOT ZOK THEN _
        GOTO 5300
     CLOSE 2

------------------------[ KG012601]-------------------------

Problem:  When a conference contains a different # of node records
that the main message based, the W)ho command will report the # of
nodes in the conference rather than the number on the main message
base.  (The # of node records in conferences can be any natural
number in RBBS.)

Solution:  Change RBBS-PC.BAS as follow.

9800 CALL WhosOn                                                     ' KG012601
     GOSUB 5344
     RETURN

Change RBBSSUB2.BAS as follows:

9801 ' $SUBTITLE: 'WhosOn - subroutine to display who is on'
' $PAGE
'
'  NAME    -- WhosOn
'
'  INPUTS  --     PARAMETER                    MEANING
'                ZActiveMessageFile$        Current message file
'                ZOrigMsgFile$              Main msg file
'
'  OUTPUTS --  None
'
'  PURPOSE --  To display who is on each node.
'
     SUB WhosOn STATIC                                               ' KG012601
     WasA1$ = ZActiveMessageFile$
     ZActiveMessageFile$ = ZOrigMsgFile$
     CALL OpenMsg
     FIELD 1, 128 AS ZMsgRec$
     GET 1,1                                                         ' KG012601
     NumNodes = VAL(MID$(ZMsgRec$,127))                              ' KG012601
     FOR NodeIndex = 2 TO NumNodes + 1
        GET 1,NodeIndex
        ZOutTxt$ = ZFG1$ + "Node" + _
             STR$(NodeIndex - 1) + ZFG2$
        WasAX$ = MID$(ZMsgRec$,79,5)                                 ' KG012001
        CALL Trim (WasAX$)                                           ' KG012001
        WasAX$ = RIGHT$("     " + WasAX$,5) + _                      ' KG012001
              " BPS: "
        IF MID$(ZMsgRec$,55,2) = "-1" AND NOT ZSysop THEN _
           ZWasY$ = "SYSOP" + SPACE$(21) _
        ELSE ZWasY$ = MID$(ZMsgRec$,1,26)
        WasAX$ = WasAX$ + ZFG3$ + ZWasY$
        IF MID$(ZMsgRec$,40,2) <> "-1" THEN _
           WasAX$ = WasAX$ + ZFG4$ + MID$(ZMsgRec$,93,22)
        IF MID$(ZMsgRec$,57,1) = "A" THEN _
           ZOutTxt$ = ZOutTxt$ + "  Online at " + _
                WasAX$ _
        ELSE IF NOT ZSysop THEN _
                ZOutTxt$ = ZOutTxt$ + _
                     " Waiting for next caller" _
             ELSE ZOutTxt$ = ZOutTxt$ + _
                       " Offline at " + _
                       WasAX$
        CALL QuickTPut1 (ZOutTxt$)
        CALL AskMore ("",ZTrue,ZTrue,ZAnsIndex,ZFalse)
        IF ZNo THEN _
           NodeIndex = NumNodes + 2
     NEXT
     ZActiveMessageFile$ = WasA1$
     CALL QuickTPut (ZEmphasizeOff$,0)
     END SUB

------------------------[ KG012502]-------------------------

Problem:  prompt on who msg is to always offers A)ll option, even when
the message base does not allow public messages!

Change RBBS-PC.BAS as follows:

2020 CALL SetWhoTo (-ZEnableCC*(ZUserSecLevel>=ZOptSec(5)),MsgTo$,MsgFrom$,RcvrRecNum,Found,INSTR(ZMsgSecCats$,"U")>0) ' KG012502
     IF MsgTo$ = "" THEN _
        RETURN
     IF ZSysopComment OR ZSysopMsg THEN _
        GOTO 2100
     IF ZReply OR MsgFwd THEN _
        Found = ZTrue : _
        CALL Trim (MsgTo$):  _
        GOTO 2035 _
     ELSE Subject$ = ""
     GOSUB 2065

4666 CALL Trim (MsgTo$)
     ZOutTxt$ = "Change receiver's name from " + _
        MsgTo$ + _
        " to"
     GOSUB 12995
     IF ZWasQ = 0 THEN _
        GOTO 4667
     IF LEN(ZUserIn$) > 30 THEN _
        CALL QuickTPut1 ("30 chars max") : _
        GOTO 4666
     CALL AllCaps (ZUserIn$)
     MsgTo$ = ZUserIn$
     TempMsgTo$ = ZUserIn$
     CALL SetWhoTo (ZFalse,MsgTo$,MsgFrom$,RcvrRecNum,Found,ZTrue)   ' KG012502
     IF MsgTo$ = "" THEN MsgTo$ = TempMsgTo$

Change RBBSSUB2.BAS as follows:

2018 ' $SUBTITLE: 'SetWhoTo - subroutine to get who a msg/upload is to'
' $PAGE
'
'  NAME    -- SetWhoTo
'
'  INPUTS  --     PARAMETER                    MEANING
'              HighestUserRecord
'
'  OUTPUTS --  MsgTo$              Who message is to
'              RcvrRecNum         User record # of who to
'
'  PURPOSE --  Asks who a message/upload is to and checks if receiver exists
'
     SUB SetWhoTo (EnableCC,MsgTo$,MsgFrom$,RcvrRecNum,Found,AllowPub) STATIC ' KG012502
     Temp$ = MsgFrom$
     CALL Trim (Temp$)
     ZNumHeaders = 0
     CALL KillWork (ZNodeWorkFile$)

2021 ZOutTxt$ = "To " + LEFT$("A)ll,",-5*AllowPub) + "(S)ysop," + _  ' KG012502
                 LEFT$("D)istribution,",-14*EnableCC) + _
                 " or name" + ZPressEnterExpert$
     CALL SkipLine (1)
     ZSemiOnly = ZTrue
     CALL PopCmdStack
     IF LEN(ZUserIn$(ZAnsIndex)) > 30 THEN _
        CALL QuickTPut1 ("30 Char. Max") : _
        GOTO 2021
     Found = ZTrue
     IF ZWasQ = 0 THEN _
        GOTO 2033 _
     ELSE ZWasDF$ = ZUserIn$(ZAnsIndex) : _
          CALL AllCaps (ZWasDF$) : _
          ZUserIn$(ZAnsIndex) = ZWasDF$ : _
          IF ZWasDF$ = "A" AND AllowPub THEN _                       ' KG012502
             MsgTo$ = "ALL" _
          ELSE IF ZWasDF$ = "S" THEN _
             MsgTo$ = "SYSOP" _
          ELSE IF ZWasDF$ = "D" AND EnableCC THEN _
             GOTO 2025 _
          ELSE MsgTo$ = ZUserIn$(ZAnsIndex) :_
               CALL AllCaps (MsgTo$)
     GOTO 2032

2032 RcvrRecNum = 0
     IF MsgTo$ <> "ALL" OR NOT AllowPub THEN _                       ' KG012502
        IF ((LEFT$(MsgTo$,4) <> "ALL " OR NOT AllowPub) AND ZStartHash = 1) THEN _ ' KG012502
           CALL CheckInt (MsgTo$) : _                                ' KG082201
           IF ZTestedIntValue = 0 OR NOT ZSysOp THEN _               ' KG082201
              ZWasDF = INSTR(MsgTo$+" @"," @") : _
              TempHashValue$ = LEFT$(MsgTo$,ZWasDF-1) : _
              CALL WhoCheck (TempHashValue$,Found,RcvrRecNum) : _
              IF NOT Found THEN _
                 ZLastIndex = 0 : _
                 RcvrRecNum = 0 : _
                 IF NOT ZReply THEN _
                    ZOutTxt$ = "Send anyway (Y,[N])" : _
                    ZTurboKey = -ZTurboKeyUser : _
                    ZLastIndex = 0 : _
                    GOSUB 2034 : _
                    IF NOT ZYes THEN _
                       GOTO 2021
     IF MsgTo$ = Temp$ THEN _
        ZOutTxt$ = "Really send this to YOURSELF (Y,[N])" : _
        ZLastIndex = 0 : _
        GOSUB 2034 : _
        IF NOT ZYes THEN _
           MsgTo$ = ""
     CALL OpenWorkA (ZNodeWorkFile$)
     CALL PrintWorkA (MsgTo$ + "," + STR$(RcvrRecNum))
     CLOSE 2
     ZNumHeaders = ZNumHeaders + 1
     IF EnableCC AND (NOT ZReply) AND MsgTo$ <> "ALL" AND _
        MsgTo$ <> "" AND LEFT$(MsgTo$,4) <> "ALL " AND _
        (NOT ZSysopComment) AND (NOT ZSysopMsg) THEN _
           ZOutTxt$ = "Carbon copy to another (Y,[N])" : _
           CALL PopCmdStack : _
           IF ZYes THEN _
              GOTO 2021

Change RBBSSUB5.BAS as follows:

20460 WhoTo$ = ""
      WasY$ = ZFileName$
      CALL KillWork (ZNodeWorkFile$)
      IF ZUserSecLevel >= ZMinSecPersUpld THEN _
         CALL SetWhoTo (ZTrue,WhoTo$,"",RcvrRecNum,Found,ZTrue) _    ' KG012502
      ELSE WhoTo$ = "ALL"
      ZFileName$ = WasY$
      RETURN

------------------------[ KG012501]-------------------------

Problem:  The conference mail scan is being left open long after the file
is read, making it difficult to replace the file on a multi-user system.

Solution:  Change RBBSSUB4.BAS as follows:

59856 ZActiveUserFile$ = WasA1$
      CALL OpenUser (ZHighestUserRecord)
      FIELD 5, 128 AS ZUserRecord$
      IF (NOT ZRet) AND NOT AnyMail THEN _
         CALL QuickTPut1 ("You have not joined any conferences")
      ZUserFileIndex = UserFileIndexSave
      LSET ZUserRecord$ = UserRecordHold$
      ZActiveMessageFile$ = MsgFileSave$
      CALL OpenMsg
      FIELD 1, 128 AS ZMsgRec$
      GET 1,1
      ZNonStop = (ZPageLength < 1)
      WasX$ = ZUserIn$(ZAnsIndex+1)
      CALL AllCaps (WasX$)
      ZAnsIndex = ZAnsIndex - (WasX$ = "C")
      SkipParms = -(NOT EOF(2))*SkipParms
      LinkNew = ZFalse
      LinkPers = ZFalse
      CLOSE 2                                                        ' KG012501
      END SUB

------------------------[ KG012401]-------------------------

Problem:  When seeing the list of new bulletins, often the caller
wishes to read only particular ones rather than all of them.  This
change lets any bullets be selected as well as all or none.

Change RBBS-PC.BAS as follows:

9760 ' ****  [entry when want review plus chance to read] *********
     GOSUB 9750
     IF NumNewBullets > 0 THEN _
        ZLastIndex = NumNewBullets + 1 : _
        ZOutTxt$ = "Read what new bulletins (A)ll,[Q]uit)" : _       ' KG012401
        GOSUB 12999 : _
        CALL AllCaps (ZUserIn$)                                      ' KG012401
        IF ZWasQ > 0 AND ZUserIn$ <> "Q" THEN _                      ' KG012401
           GOSUB 9761 : _                                            ' KG012401
           ZAnsIndex = 0 : _
           ZLastIndex = NumNewBullets : _
           GOTO 9700
     ZLastIndex = 0
     IF ZAnsIndex < 1 THEN _
        RETURN
     GOTO 9701
9761 IF ZUserIn$ <> "A" THEN _                                       ' KG012401
        NumNewBullets = ZWasQ _                                      ' KG012401
     ELSE _                                                          ' KG012401
        FOR Temp = 1 TO NumNewBullets : _                            ' KG012401
           ZUserIn$(Temp) = ZOutTxt$(Temp+1) : _                     ' KG012401
        NEXT                                                         ' KG012401
     RETURN                                                          ' KG012401

------------------------[ KG012301]-------------------------

Problem:  When join a conference, reading continuuously, being
asked if want to check messages.  It is not possible to stack any
answer to this prompt.

Solution:  Change RBBS-PC.BAS as follows:

1895 IF TurboLogon OR ZNonStop THEN _                                ' KG012301
        RETURN
     ZOutTxt$ = "Check mail in " + ZConfName$ + " ([Y],N)"
     GOSUB 12930                                                     ' KG012301
     IF ZNo THEN _
        SkipMain = ZTrue : _
        RETURN
     ZUserIn$(0) = LEFT$("NEW ",-4*LogonMailNew)

------------------------[ KG012001]-------------------------

Problem:  Who command showing the speed of caller as the pc-to-modem
speed, rather than the line speed.

Change RBBS-PC.BAS as follows:

819 CALL Trim (ZWasCI$)
    IF (ZNodeRecIndex < 2) THEN _
       GOTO 821
    GOSUB 4910
    GOSUB 24000
    GET 1,ZNodeRecIndex
    MID$(ZMsgRec$,1,31) = ZActiveUserName$ + _
                                 SPACE$(31 - LEN(ZActiveUserName$))
    MID$(ZMsgRec$,40,2) = " 0"
    MID$(ZMsgRec$,44,2) = RIGHT$(STR$(-ZBPS),2)
    MID$(ZMsgRec$,55,2) = " 0"
    MID$(ZMsgRec$,57,1) = "A"
    MID$(ZMsgRec$,60,5) = ZTalkToModemAt$ + _
                                 SPACE$(5 - LEN(ZTalkToModemAt$))
    MID$(ZMsgRec$,72,2) = " 0"
    MID$(ZMsgRec$,79,5) = ZCBaud$ + SPACE$(5 - LEN(ZCBaud$))         ' KG012001
    MID$(ZMsgRec$,93,24) = ZWasCI$ + _
                                  SPACE$(24)
    PUT 1,ZNodeRecIndex
    GOSUB 12985

Change RBBSSUB2.BAS as follows:

9801 ' $SUBTITLE: 'WhosOn - subroutine to display who is on'
' $PAGE
'
'  NAME    -- WhosOn
'
'  INPUTS  --     PARAMETER                    MEANING
'                NumNodes                   # of nodes to check
'                ZActiveMessageFile$        Current message file
'                ZOrigMsgFile$              Main msg file
'
'  OUTPUTS --  None
'
'  PURPOSE --  To display who is on each node.
'
     SUB WhosOn (NumNodes) STATIC
     WasA1$ = ZActiveMessageFile$
     ZActiveMessageFile$ = ZOrigMsgFile$
     CALL OpenMsg
     FIELD 1, 128 AS ZMsgRec$
     FOR NodeIndex = 2 TO NumNodes + 1
        GET 1,NodeIndex
        ZOutTxt$ = ZFG1$ + "Node" + _
             STR$(NodeIndex - 1) + ZFG2$
        WasAX$ = MID$(ZMsgRec$,79,5)                                 ' KG012001
        CALL Trim (WasAX$)                                           ' KG012001
        WasAX$ = RIGHT$("     " + WasAX$,5) + _                      ' KG012001
              " BPS: "
        IF MID$(ZMsgRec$,55,2) = "-1" AND NOT ZSysop THEN _
           ZWasY$ = "SYSOP" + SPACE$(21) _
        ELSE ZWasY$ = MID$(ZMsgRec$,1,26)
        WasAX$ = WasAX$ + ZFG3$ + ZWasY$
        IF MID$(ZMsgRec$,40,2) <> "-1" THEN _
           WasAX$ = WasAX$ + ZFG4$ + MID$(ZMsgRec$,93,22)
        IF MID$(ZMsgRec$,57,1) = "A" THEN _
           ZOutTxt$ = ZOutTxt$ + "  Online at " + _
                WasAX$ _
        ELSE IF NOT ZSysop THEN _
                ZOutTxt$ = ZOutTxt$ + _
                     " Waiting for next caller" _
             ELSE ZOutTxt$ = ZOutTxt$ + _
                       " Offline at " + _
                       WasAX$
        CALL QuickTPut1 (ZOutTxt$)
        CALL AskMore ("",ZTrue,ZTrue,ZAnsIndex,ZFalse)
        IF ZNo THEN _
           NodeIndex = NumNodes + 2
     NEXT
     ZActiveMessageFile$ = WasA1$
     CALL QuickTPut (ZEmphasizeOff$,0)
     END SUB

------------------------[ KG011501]-------------------------

Problem:  menu for an option is shown automatically when an option
picked that does not exist, such as a conference.  The mistake is
usually a misspelling versus ignorance of what options exist.  Therefore,
don't automatically put the menu up.  If novice, put it up.  If expert,
don't.  Caller can ask for a L)ist to get the list of options.  Was
penalizing the misspeller too much.

Change RBBSSUB4.BAS as follows.

59510 ZFileName$ = CurMenu$
      InMenu = ZTrue
      CALL BreakFileName (FrontOpt$,WasX$,FrontPre$,ZWasDF$,ZTrue)
      CALL BreakFileName (CurMenu$,MenuDrv$,WasX$,ZWasDF$,ZTrue)
      MenuFront$ = MenuDrv$ + LEFT$(WasX$,LEN(WasX$)-LEN(PreSuf$))
      IF CurMenu$ = LastSubMenu$ THEN _
         MenuFront$ = LEFT$(MenuFront$,LEN(MenuFront$)-1)
      CALL Graphic (ZFileName$)
      CurMenuVer$ = ZFileName$
      ZStopInterrupts = ZFalse
59514 IF ZAnsIndex < ZLastIndex OR ZExpertUser THEN _                ' KG011501
         GOTO 59520

59532 GOSUB 59547
      GOTO 59514                                                     ' KG011501

------------------------[ KG011201]-------------------------

Enhancement:  Enhancements macro stack command ({ST) to stack carriage-
returns using the "|" symbol.  Also, enhances the message section to
support entering a message thru the macro stack.  This allows messages
to be automatically generated by macros.

Change RBBS-PC.BAS as follows:

2010 IF NOT QuotedReply THEN _
        ZLinesInMsg = 0 : _                                          ' KG011201
        WasL = 0 : _
        WasX = 0 : _
        REDIM ZOutTxt$(ZMsgDim)
     IF ZGetExtDesc THEN _
        GOTO 2100
     GOSUB 1893
     RcvrRecNum = 0

Change RBBSSUB2.BAS as follows:

3730 IF TabToSpace > 0 THEN _
        WasX$ = " " : _
        TabToSpace = TabToSpace - 1 : _
        GOTO 3750
     CALL FindFKey
     IF ZSubParm < 0 THEN _
        EXIT SUB
     WasX$ = ZKeyPressed$
     IF WasX$ = "" THEN _
        GOTO 3732 : _                                                ' KG011201
        IF ZLocalUser THEN _
           GOTO 3733 _
        ELSE GOTO 3732
     IF WasX$ = ZEscape$ THEN _
        ZKeyPressed$ = WasX$ : _
        EXIT SUB
     SendRemote = ZTrue
     WasZ = INSTR(ZLineEditChk$,WasX$)
     IF WasZ < 1 THEN _
        GOTO 3750 _
     ELSE IF WasZ > 4 THEN _
             GOTO 3870 _
     ELSE IF WasZ = 1 THEN _
             GOTO 3810
     IF ZLocalUser THEN _
        GOTO 3730
* REPLACING old line(s) by new
3732 IF ZCommPortStack$ <> "" THEN _
        WasX$ = LEFT$(ZCommPortStack$,1) : _
        ZCommPortStack$ = RIGHT$(ZCommPortStack$,LEN(ZCommPortStack$)-1) : _
        GOTO 3738
     IF NOT ZLocalUser THEN _                                        ' KG011201
        CALL EofComm (Char) : _                                      ' KG011201
        IF Char <> -1 THEN _                                         ' KG011201
           GOTO 3736                                                 ' KG011201

Change RBBSSUB5.BAS as follows:

63355 CALL GlobalSrchRepl (WasX$,"|",ZCarriageReturn$,ZTrue)        ' KG011201
      ZCommPortStack$ = ZCommPortStack$ + WasX$ + ZCarriageReturn$  ' STack
      GOTO 63336

------------------------[ KG100701]-------------------------

Problem:  Subboard def file is allowed to change the network
type.

Solution:  Change RBBSSUB1.BAS as follows:

117 IF ZSubParm <> -62 THEN _
       IF PrevRead$ = ConfigFile$ THEN _
          EXIT SUB _
       ELSE PrevRead$ = ConfigFile$
    CLOSE 2
    ZBulletinSave$ = ZBulletinMenu$
    CALL OpenWork (2,ConfigFile$)
    ZCurDef$ = ConfigFile$
    INPUT #2,ZWasDF$, _
             ZDnldDrives$, _
             ZSysopPswd1$, _
             ZSysopPswd2$, _
             ZSysopFirstName$, _
             ZSysopLastName$, _
             ZRequiredRings, _
             ZStartOfficeHours, _
             ZEndOfficeHours, _
             ZMinsPerSession, _
             ZWasDF, _
             ZWasDF, _
             ZUpldDir$, _
             ZExpertUserDef, _
             ZActiveBulletins, _
             ZPromptBellDef, _
             ZWasDF, _
             ZMenusCanPause, _
             ZMenu$(1), _
             ZMenu$(2), _
             ZMenu$(3), _
             ZMenu$(4), _
             ZMenu$(5), _
             ZMenu$(6), _
             ZConfMenu$, _
             ZTestANSITime, _
             ZWelcomeInterruptable, _
             ZRemindFileXfers, _
             ZPageLengthDef, _
             ZMaxMsgLinesDef, _
             ZDoorsAvail, _
             ZWasDF$, _
             ZMainMsgFile$, _
             ZMainMsgBackup$
    INPUT #2, WasX$, _
              ZCmntsFile$, _
              ZMainUserFile$, _
              ZWelcomeFile$, _
              ZNewUserFile$, _
              ZMainDirExtension$
    CALL BreakFileName (WasX$,ZWasY$,ZWasDF$,ZWasZ$,ZFalse)
    IF ZWasDF$ <> "" THEN _
       ZCallersFile$ = WasX$
    INPUT #2, ZWasDF$
    IF ZComPort$ <> "COM0" THEN _
       IF NOT ZConfMode THEN _
          ZComPort$ = ZWasDF$
    INPUT #2, ZBulletinsOptional, _
              ZModemInitCmd$, _
              ZRTS$, _
              ZCallersLst$, _
              ZFG, _
              ZBG, _
              ZBorder
    IF ZConfMode THEN _
       INPUT #2, ZWasDF$, _
                 ZWasDF$ _
    ELSE INPUT #2, ZRBBSBat$ , _
                   ZRCTTYBat$
    INPUT #2,ZOmitMainDir$, _
             ZFirstNamePrompt$, _
             ZHelp$(3), _
             ZHelp$(4), _
             ZHelp$(7), _
             ZHelp$(9), _
             ZBulletinMenu$, _
             ZBulletinPrefix$, _
             ZWasDF$, _
             ZMsgReminder, _
             ZRequireNonASCII, _
             ZAskExtendedDesc, _
             ZMaxNodes                                               ' KG100701
    IF ZConfMode THEN _                                              ' KG100701
       INPUT #2, ZwasDF, ZwasDF _                                    ' KG100701
    ELSE INPUT #2, ZNetworkType, _                                   ' KG100701
                   ZRecycleToDos
    INPUT #2,ZWasDF, _
             ZWasDF, _
             ZTrashcanFile$
                .
                .
                .

------------------------[ KG092301]-------------------------

Enhancement.  This makes it possible to write macros so that they
work the same reguardless of whether the user is in turbo-key mode.
When passing keystrokes in a macro, simply begin them with "/".
When the user is in turbo-key mode, this will simply suspend it
for that line.   When not in turbo-key mode, this change will
strip out a leading "/".   The effect will make the line work
exactly the same.  Note:  if you want the macro to pass the "/"
as a keystroke, simply add a space (" /" will have the
same effect as "/" prior to this change).

Change RBBSSUB2.BAS as follows:

1534 ZUserIn$ = ZOutTxt$   ' Not Macro command - pass to normal processing
' * strip off leading slash when not in turbokey mode so macros can be
' * written to work in both turbo and non-turbo-key mode
     IF LEFT$(ZUserIn$,1) = "/" THEN IF NOT ZTurboKeyUser THEN _     ' KG092301
        ZUserIn$ = RIGHT$(ZUserIn$,LEN(ZUserIn$)-1) : _              ' KG092301
        ZTurboKey = ZFalse                                           ' KG092301
     IF ZMacroEcho THEN _
        ZSubParm = 4 : _
        CALL TPut
     WasX$ = ZCarriageReturn$
     GOTO 1547

------------------------[ KG092201]-------------------------

Problem:  RBBS gets the line speed but doesn't report it to the
caller or log it to callers file.

Change RBBS-PC.BAS as follows:

800 IF ZAdjustedSecurity THEN _
       GOSUB 5135
    IF ZOrigCnfg$ = ZCurDef$ THEN _
       ZMainUserFileIndex = ZUserFileIndex : _
       ZOrigSec = ZUserSecLevel : _
       ZUserSecSave = ZUserSecLevel : _
       ZOrigUserName$ = ZActiveUserName$
    ZTimesLoggedOn = CVI(MID$(ZUserOption$,1,2)) - _
       ((ZOrigCnfg$ <> ZCurDef$ OR NOT ZSubBoard) AND _
        (NOT ZPrivateDoor) AND (NOT ZExitToDoors))
    GOSUB 9500
    IF (NOT ZExitToDoors) AND (NOT ZSubBoard) THEN _
       CALL UpdtCalr (ZActiveUserName$ + " from " + ZWasCI$ + _
                 " Lvl" + STR$(ZUserSecLevel) + " " + TIME$,2) : _   ' KG092201
       CALL UpdtCalr ("Line Speed " + ZCBaud$,2)                     ' KG092201
    PrevLastOn$ = ZLastDateTimeOn$
    IF ZLocalUser THEN _
       ZTalkToModemAt$ = "9600" : _
       ZBaudParity$ = "9600 BPS,N,8,1" : _
       ZModemInitBaud$ = "9600" : _
       ZSnoop = ZTrue : _
       ZLineFeeds = ZTrue
    CALL SetCrLf
    CALL SetPrompt
    CALL XferType (2,ZTrue)
    IF NOT ZSubBoard THEN _
       BoardCheckDate$ = PrevLastOn$
    CALL SetSysOp
    IF ZWasA THEN _
       ZActiveUserName$ = "SYSOP" : _
       ZFirstName$ = "SysOp"
    IF ZExitToDoors OR ZSubBoard THEN _
       GOTO 815
    GOSUB 465
    IF (ZEightBit AND _
       ZAutoDownDesired) OR _
       ZAskID THEN _
       CALL TestUser
    CALL QuickTPut1 ("Logging " + ZActiveUserName$)
    CALL Talk (1,ZOutTxt$)
    Temp$ = STR$(ZBaudTest!) + MID$(ZBaudParity$,INSTR(ZBaudParity$," B"))
    CALL QuickTPut1 ("RBBS-PC " + ZVersionID$ + " Node " + ZNodeID$) ' KG092201
    CALL QuickTPut1 ("Line speed " + ZCBaud$  + "  Host operating at" + Temp$) ' KG092201
    CALL SkipLine (1)
    Attempts = 0
    ZWasZ$ = ZActiveUserName$ + _
            " on at " + _
            ZCurDate$ + _
            ", " + _
            ZTime$ + _
            " from " + _
            ZWasCI$ + _
            "," + Temp$
     ZWasNG$ = ZWasZ$ + SPACE$(128 - LEN(ZWasZ$))
'
' *  ALWAYS RECORD THE HASH/INDIVIDUATING FIELD TO EACH RECORD LOGGED OUT
'
     WasX$ = "{" + _
          HashValue$ + _
          "/" + _
          ZIndivValue$ + _
          "}"
     IF LEN(ZWasZ$) < 65 THEN _
        WasX = 65 _
     ELSE WasX = LEN(ZWasZ$) + 2
     MID$(ZWasNG$,WasX) = WasX$
     CALL Printit ("  " + ZWasZ$)
     IF ZNewUser THEN _
        CALL UpdtCalr ("NEWUSER",1) : _
        CALL Muzak (2)
'
' *****  NOTIFY CALLER IF ABLE TO "AUTODOWN"  ****
'
    IF ZEightBit AND ZAutoDownYes THEN _
       ZOutTxt$ = CHR$(9) + _
            ZReturnLineFeed$ + _
            "You may use AUTODOWNLOADing!" : _
       CALL RingCaller : _
       CALL DelayTime(4)

------------------------[ KG091002]-------------------------

Problem:  Possible to get an untrapped error when the FMS directory 
being read does not match in length that specified in CONFIG.  This
changes makes the FMS directory readable without error even when it
does not match.

58190 ' $SUBTITLE: 'OpenFMS - subroutine to open the FMS directory'
' $PAGE
'
'  NAME    -- OpenFMS
'
'  INPUTS  -- PARAMETER                      MEANING
'             ZShareIt                DOS SHARING FLAG
'             ZFMSDirectory$          NAME OF FMS DIRECTORY
'
'  OUTPUTS -- LastRec                NUMBER OF THE Last
'                                    RECORD IN THE FILE
'             CatLen                 Length of the category code
'
'  PURPOSE -- To open the upload directory as a random file and find
'             the number of the last record in the file.
'
      SUB OpenFMS (LastRec,CatLen) STATIC
      ON ERROR GOTO 65000
      CLOSE 2
      IF ZActiveFMSDir$ = "" THEN _
         IF ZMenuIndex = 6 THEN _
            ZActiveFMSDir$ = ZLibDir$ _
         ELSE ZActiveFMSDir$ = ZFMSDirectory$
      OldFile = (ZActiveFMSDir$ = PrevFMS$)
      IF OldFile THEN _
         GOTO 58192
      CALL OpenWork (2,ZActiveFMSDir$)
      CALL ReadDir (2,1)
      IF ZErrCode > 0 OR LEN(ZOutTxt$) < 37 THEN _                   ' KG091002
         IF ZActiveFMSDir$ = ZPersonalDir$ THEN _
            ZFMSFileLength = 36 + ZMaxDescLen + ZPersonalLen _
         ELSE ZFMSFileLength = 38 + ZMaxDescLen _
      ELSE ZFMSFileLength = LEN(ZOutTxt$) + 2
      IF ZFMSFileLength < 86 THEN _                                  ' KG091002
         CalcCatLen = 3 : _                                          ' KG091002
         ZMaxDescLen = ZFMSFileLength - 38 _                         ' KG091002
      ELSE CalcCatLen = ZPersonalLen : _                             ' KG091002
           ZMaxDescLen = ZFMSFileLength - 36 - ZPersonalLen          ' KG091002
      CLOSE 2

------------------------[ KG091001]-------------------------

Problem:  When personal files are stored in the drive/path for personal
files, and this drive/path is not in download areas, then the file can
be downloaded but not viewed.   This makes those personal files viewed,
but subject to the same constaints as downloading, so that when in
the personal directory callers can view only those files listed and to
them.   Note:  this change is an improvement on one submitted by
Tom Hansen and Dan Shore.

Solution:  Change RBBSSUB2.BAS as follows:

20142 IF ZAnsIndex > ZLastIndex THEN _
         IF ZLastIndex > 1 OR Drive$ <> "" THEN _                    ' KG091001
            EXIT SUB _
         ELSE GOTO 20141
      GOSUB 20143
      IF ZSubParm < 0 THEN _
         EXIT SUB
      ZAnsIndex = ZAnsIndex + 1
      GOTO 20142

20145 IF Drive$ <> "" THEN _                                         ' KG091001
         ZFileNameHold$ = Prefix$ + "." + Ext$ : _                   ' KG091001
         CALL FindFile (ZFileName$,ZOK) _                            ' KG091001
      ELSE CALL RotorsDir (ZFileName$,ZSubDir$(),ZSubDirCount + (NOT ZSysop),ZTrue,"V") ' KG091001
      IF ZOK THEN _
         GOTO 20148

Change RBBSSUB3.BAS as follows:

58181 MarkingFiles = ZFalse
      IF ((WasX$ = "D" OR WasX$ = "M") AND CanDnld) OR (WasX$ = "V" AND CanView) THEN _ ' KG091001
         MarkingFiles = (WasX$ = "M") : _
         CALL AskItems ("DMV",WasX$,ZTrue,"file",ZMarkedFiles$) : _   ' KG091001
         IF ZWasQ = 0 THEN _
            GOTO 58183
      IF WasX$ = "*" THEN IF ZPersonalDnld THEN _
         GOTO 58193

58183 IF ZJumpSearching THEN _
         PrevSearch$ = SearcFor$ : _
         SearchFor$ = ZJumpTo$ _
      ELSE SearchFor$ = SearchString$ : _
           IF NOT ZYes AND CanDnld THEN _
              GOSUB 58188 : _
              IF WasX$ = "V" AND CanView AND ZLastIndex >= ZAnsIndex THEN _ ' KG091001
                 ZAnsIndex = ZAnsIndex - 1 : _                       ' KG091001
                 CALL GetArc : _                                     ' KG091001
                 ZJumpSupported = ZTrue : _                          ' KG091001
                 ZWasA = UpldIndex : _                               ' KG091001
                 GOSUB 58185 : _                                     ' KG091001
                 UpldIndex = ZWasA : _                               ' KG091001
                 GOTO 58180 _                                        ' KG091001
              ELSE IF WasX$ <> "L" AND ZLastIndex >= ZAnsIndex AND NOT MarkingFiles THEN _
                 CALL SkipLine (1) : _
                 DnldFlag = 1 : _
                 ReListAt = UpldIndex : _
                 EXIT SUB _      ' exit for downloading
              ELSE IF UpldIndex = CutoffRec THEN _
                      GOTO 58184
      IF ZNonStop THEN IF UpldIndex > 999 THEN _
         IF (SearchDate$ = "" OR NOT ZExpertUser) THEN _
            ZOutTxt$ = STR$(UpldIndex) + _
               " lines left to search.  Really go non-stop? (Y,[N])" : _
            ZNoAdvance = ZTrue : _
            ZTurboKey = -ZTurboKeyUser : _
            ZSubParm = 1 : _
            CALL TGet : _
            CALL WipeLine (79) : _
            ZNonStop = ZYes
      GOTO 58168

58188 IF ProcessedNew OR MarkingFiles OR NOT ZListOnly THEN _
         ProcessedNew = ZFalse : _
         RETURN
      ZUserIn$(0) = ""
      WasI = ZAnsIndex              ' check whether in dir
      WHILE WasI <= ZLastIndex
         CALL AraAllCaps (ZUserIn$(),WasI)
         ZWasZ$ = ZUserIn$(WasI)
         CALL UnMarkItems (ZMarkedFiles$,WasI,ZLastIndex,WasX,ZTrue)
         Temp$ = ZUserIn$(WasI)
         CALL AllCaps (Temp$)                                        ' KG062401
'print "wasi=";wasi;" temp$=<";temp$;"> Zdef=<";zdefaultxfer$;">"
         IsProto = (LEN(Temp$) = 1 AND _
                    INSTR(ZDefaultXfer$,Temp$) > 0)
         ZOK = IsProto
         WasJ = LastRec + 1
         WasX = INSTR(Temp$,".")
         AltTemp$ = ""
         IF NOT IsProto THEN _
            IF WasX = 0 THEN _
               AltTemp$ = Temp$ + "." + ZDefaultExtension$ _
            ELSE IF WasX = LEN(Temp$) THEN _
                    AltTemp$ = LEFT$(Temp$,WasX-1)
'print "58188 b4 while zok=";zok;" wasj=";wasj;" looking for <";temp$;">"
         WHILE WasJ > 1 AND NOT ZOK
            WasJ = WasJ - 1
            GET #2,WasJ
            GOSUB 58191
'print "bk 58191 canget=";catget;" ptp<";parttoprint$;">";:input xx$
            IF CanGet THEN _
               MID$(PartToPrint$,13,1) = " " : _
               ZWasY$ = LEFT$(PartToPrint$,INSTR(PartToPrint$," ") - 1) : _ ' KG091001
               ZOK = (Temp$ = ZWasY$) : _                            ' KG091001
               IF NOT ZOK THEN _
                  IF AltTemp$ <> "" THEN _
                     ZOK = (AltTemp$ = ZWasY$)                       ' KG091001
         WEND
'print "58188 aft while zok=";zok;" wasj=";wasj;" looking for <";temp$;">":input xxx$
         IF ZOK THEN _
            GOSUB 58189 : _
            IF ZOK OR IsProto THEN _
               ZWasY$ = MID$(STR$(WasJ),2) : _                       ' KG091001
               ZUserIn$(0) = ZUserIn$(0) + _
                       ZWasY$ + _                                    ' KG091001
                       SPACE$(5 - LEN(ZWasY$))                       ' KG091001
         IF NOT ZOK AND NOT IsProto THEN _
            CALL QuickTPut1 (ZWasZ$ + " not found - omitted") : _
            FOR WasK = WasI + 1 TO ZLastIndex : _
               ZUserIn$(WasK - 1) = ZUserIn$(WasK) : _
            NEXT : _
            ZLastIndex = ZLastIndex - 1 : _
            WasI = WasI - 1
         WasI = WasI + 1
      WEND
      ZWasQ = ZLastIndex
'print "end 58188 zlastindex=";zlastindex;" zok=";zok
      RETURN

58196 CALL QuickTPut (ZEmphasizeOff$,0)
      ZOutTxt$ = Temp$ + "L)ist,A)bort," + _
                 LEFT$("*)dnld new,",-11*ZPersonalDnld) + _
                 "M)ark" + LEFT$(",D)nld",-6*CanDnld) + _
                  LEFT$(",V)iew",-6*CanView) + ZPressEnterExpert$
      ZTurboKey = -ZTurboKeyUser
      CALL PopCmdStack
      WasX$ = ZUserIn$(ZAnsIndex)
      CALL AllCaps (WasX$)
      IF WasX$ = "A" THEN ZRet = ZTrue
      IF ZWasQ = 0 OR ZRet OR ZSubParm < 0 THEN _
         GOTO 58198
      IF WasX$ = "L" THEN _
         ZActiveFMSDir$ = OrigDir$ : _
         GOSUB 58185 : _
         AtEndList = ZFalse : _
         GOTO 58168                                                  ' KG091001
      ZYes = ZFalse
      GOTO 58181

------------------------[ KG082201]-------------------------

Enhancement:  Lets the SysOp upload to a security level.

Change RBBSSUB2.BAS as follows:

2032 RcvrRecNum = 0
     IF MsgTo$ <> "ALL" THEN _
        IF (LEFT$(MsgTo$,4) <> "ALL " AND ZStartHash = 1) THEN _
           CALL CheckInt (MsgTo$) : _                                ' KG082201
           IF ZTestedIntValue = 0 OR NOT ZSysOp THEN _               ' KG082201
              ZWasDF = INSTR(MsgTo$+" @"," @") : _
              TempHashValue$ = LEFT$(MsgTo$,ZWasDF-1) : _
              CALL WhoCheck (TempHashValue$,Found,RcvrRecNum) : _
              IF NOT Found THEN _
                 ZLastIndex = 0 : _
                 RcvrRecNum = 0 : _
                 IF NOT ZReply THEN _
                    ZOutTxt$ = "Send anyway (Y,[N])" : _
                    ZTurboKey = -ZTurboKeyUser : _
                    ZLastIndex = 0 : _
                    GOSUB 2034 : _
                    IF NOT ZYes THEN _
                       GOTO 2021
     IF MsgTo$ = Temp$ THEN _
        ZOutTxt$ = "Really send this to YOURSELF (Y,[N])" : _
        ZLastIndex = 0 : _
        GOSUB 2034 : _
        IF NOT ZYes THEN _
           MsgTo$ = ""
     CALL OpenWorkA (ZNodeWorkFile$)
     CALL PrintWorkA (MsgTo$ + "," + STR$(RcvrRecNum))
     CLOSE 2
     ZNumHeaders = ZNumHeaders + 1
     IF EnableCC AND (NOT ZReply) AND MsgTo$ <> "ALL" AND _
        MsgTo$ <> "" AND LEFT$(MsgTo$,4) <> "ALL " AND _
        (NOT ZSysopComment) AND (NOT ZSysopMsg) THEN _
           ZOutTxt$ = "Carbon copy to another (Y,[N])" : _
           CALL PopCmdStack : _
           IF ZYes THEN _
              GOTO 2021

Change RBBSSUB3.BAS as follows:

20717 CALL FindItX (ZNodeWorkFile$,7)
      ZUserIn$ = Desc$
      WasX$ = DATE$
      ZWasZ$ = LEFT$(WasX$,6) + _
           RIGHT$(WasX$,2)
      ZWasEN$ = ZPersonalDir$
      NumPersonals = 0
      IF NOT ZOK THEN _
         GOTO 20718
      UserFileIndexSave = ZUserFileIndex
      UserRecordHold$ = ZUserRecord$
      WHILE NOT EOF(7)
         CALL ReadParmsX (7,ZWorkAra$(),2,1)
         IF LEFT$(ZWorkAra$(1),4) <> "ALL " AND ZWorkAra$(1) <> "ALL" THEN _
            NumPersonals = NumPersonals + 1 : _
            UCat$ = ZWorkAra$(1) : _
            GOSUB 20737 : _                                          ' KG082201
            GOSUB 20728 : _
            RcvrRecNum = VAL (ZWorkAra$(2)) : _
            CALL SetUserFlag (RcvrRecNum,4096,"file")
      WEND
      CLOSE 7
      IF NumPersonals > 0 THEN _
         ZUserFileIndex = UserFileIndexSave : _
         LSET ZUserRecord$ = UserRecordHold$ : _
         GOTO 20723

20736 IF NOT ZOK THEN _
         ZBytesInFile# = 0.0_
      ELSE ZBytesInFile# = LOF(2)
      IF ZBytesInFile# < 2.0 THEN _
         EXIT SUB
      RETURN                                                         ' KG082201
20737 CALL CheckInt (UCat$)                                          ' KG082201
      IF ZTestedIntValue > 0 THEN _                                  ' KG082201
         UCat$ = " " + UCat$                                         ' KG082201
      RETURN                                                         ' KG082201
      END SUB

------------------------[ KG082101]-------------------------

Problem:  Possible for caller to regain banked time.   Also, the
session limit specified in a subboard config may fail to get
applied.

Solution:  Change RBBSSUB2.BAS as follows:

120 '  $SUBTITLE: 'EditDef - sub to edit config parameters'
'  $PAGE
'
'  NAME    -- EditDef
'
'  INPUTS  --     PARAMETER                    MEANING
'
'  OUTPUTS --                          OUTPUT STRING
'
'  PURPOSE -- Interpretes and adjusts stored configuration parameters
'
      SUB EditDef STATIC
      ZMinsPerSessionDef = ZMinsPerSession                           ' KG082101
      ZAllOpts$ = ZMainCmds$ + _
                  ZFileCmd$ + _
                  ZUtilCmds$ + _
                  ZLibCmds$ + _
                  ZGlobalCmnds$ + _
                  ZSysopCmds$
                     .
                     .
                     .

5503 IF SignTime = 1 THEN _
        ZOutTxt$ = "Withdraw" _
     ELSE ZOutTxt$ = "Deposit"
     Temp$ = ZOutTxt$ + " how many mins"
     CALL ChangeInt (ZFalse,Temp$,Temp,0,Maxtime)
     IF ZWasQ = 0 OR ZTestedIntValue = 0 THEN _
        GOTO 5501
     ZTestedIntValue = SignTime * ZTestedIntValue
     CALL ChkAddedTime (ZTestedIntValue)
     IF ZTestedIntValue = 0 THEN _
        GOTO 5501
     ZSecsPerSession! = ZSecsPerSession! + (ZTestedIntValue * 60)
     IF ZMaxPerDay = 0 THEN _                                        ' KG082101
        ZTimeCredits! = ZTimeCredits! + ZTestedIntValue * 60         ' KG082101
     ZElapsedTime = ZElapsedTime - ZTestedIntValue
     ZGlobalBankTime = ZGlobalBankTime - ZTestedIntValue
     GOSUB 5507
     GOTO 5501

------------------------[ KG070401]-------------------------

Problem:  The UTIL.HLP refers to "B)aud change" when this has
become "B)ank time".

Solution:  a replacement UTIL.HLP is provided.

------------------------[ RH070402]-------------------------

Problem:  When viewing a callers file and timeout at the More prompt,
get untrapped error.

Solution:  Change RBBSSUB3.BAS as follows:

57100 IF INSTR(ZOutTxt$,"LOGON DENIED") OR INSTR(ZOutTxt$,"Lvl ")THEN _
         IF NOT ZSysOp THEN _
            RETURN
      IF ZJumpSearching THEN _
         ZWasDF$ = ZOutTxt$ : _
         CALL AllCaps (ZWasDF$) : _
         IF INSTR(ZWasDF$,ZJumpTo$) = 0 THEN _
            RETURN _
         ELSE CALL CheckColor (ZOutTxt$,ZJumpTo$,"") : _
              ZJumpSearching = ZFalse
      ZSubParm = 5
      CALL TPut
      WasX = 1
      CALL AskMore ("",ZTrue,ZTrue,WasX,ZFalse)
      IF ZSubParm = -1 THEN _                                        ' RH070402
         GOTO 57102 _                                                ' RH070402
      ELSE IF ZNo THEN _                                             ' RH070402
         GOTO 57101                                                  ' RH070402
      RETURN

------------------------[ RH070401]-------------------------

Problem:  When SysOp views callers file on another node, thereafter
his own logging to caller's file goes to the other node's callers.

Solution:  Change RBBSSUB3.BAS as follows:

57102 ZJumpSupported = ZFalse
      IF OrigCal$ <> ZCallersFile$ THEN _                            ' RH070401
         ZCallersFile$ = OrigCal$ : _
         CALL SetCall
      END SUB

------------------------[ BH070401]-------------------------

Problem:  "[CBAUD]" can include a leading blank, which causes it not
to work with some external protocols, like HSLink.

Solution:  Change RBBSSUB2.BAS as follows:

(line 1654)

            .
            .
            .
      SUB SetBaud STATIC
     IF ZCBaud$ = "" THEN _
        ZCBaud$ = MID$(ZBaudRates$,(-5 * ZBPS),5) : _                ' BH070401
        CALL Trim (ZCBaud$)                                          ' BH070401
     Temp! = VAL(ZCBaud$)
            .
            .
            .

------------------------[ KG062401]-------------------------

Problem:  When say to download marked files in a personal directory,
says unable to find "M".

Solution:  Change RBBSSUB3.BAS as follows:

58181 MarkingFiles = ZFalse
      IF (WasX$ = "D" OR WasX$ = "M") THEN IF CanDnld THEN _
         MarkingFiles = (WasX$ = "M") : _
         CALL AskItems ("DM",WasX$,ZTrue,"file",ZMarkedFiles$) : _   ' KG062401
         IF ZWasQ = 0 THEN _
            GOTO 58183
      IF WasX$ = "*" THEN IF ZPersonalDnld THEN _
         GOTO 58193

58188 IF ProcessedNew OR MarkingFiles OR NOT ZListOnly THEN _
         ProcessedNew = ZFalse : _
         RETURN
      ZUserIn$(0) = ""
      WasI = ZAnsIndex              ' check whether in dir
      WHILE WasI <= ZLastIndex
         CALL AraAllCaps (ZUserIn$(),WasI)
         ZWasZ$ = ZUserIn$(WasI)
         CALL UnMarkItems (ZMarkedFiles$,WasI,ZLastIndex,WasX,ZTrue)
         Temp$ = ZUserIn$(WasI)
         CALL AllCaps (Temp$)                                        ' KG062401
'print "wasi=";wasi;" temp$=<";temp$;"> Zdef=<";zdefaultxfer$;">"
         IsProto = (LEN(Temp$) = 1 AND _
                    INSTR(ZDefaultXfer$,Temp$) > 0)
         ZOK = IsProto
         WasJ = LastRec + 1
         WasX = INSTR(Temp$,".")
         AltTemp$ = ""
         IF NOT IsProto THEN _
            IF WasX = 0 THEN _
               AltTemp$ = Temp$ + "." + ZDefaultExtension$ _
            ELSE IF WasX = LEN(Temp$) THEN _
                    AltTemp$ = LEFT$(Temp$,WasX-1)
'print "58188 b4 while zok=";zok;" wasj=";wasj;" looking for <";temp$;">"
         WHILE WasJ > 1 AND NOT ZOK
            WasJ = WasJ - 1
            GET #2,WasJ
            GOSUB 58191
'print "bk 58191 canget=";catget;" ptp<";parttoprint$;">";:input xx$
            IF CanGet THEN _
               MID$(PartToPrint$,13,1) = " " : _
               WasX$ = LEFT$(PartToPrint$,INSTR(PartToPrint$," ") - 1) : _
               ZOK = (Temp$ = WasX$) : _
               IF NOT ZOK THEN _
                  IF AltTemp$ <> "" THEN _
                     ZOK = (AltTemp$ = WasX$)
         WEND
'print "58188 aft while zok=";zok;" wasj=";wasj;" looking for <";temp$;">":input xxx$
         IF ZOK THEN _
            GOSUB 58189 : _
            IF ZOK OR IsProto THEN _
               WasX$ = MID$(STR$(WasJ),2) : _
               ZUserIn$(0) = ZUserIn$(0) + _
                       WasX$ + _
                       SPACE$(5 - LEN(WasX$))
         IF NOT ZOK AND NOT IsProto THEN _
            CALL QuickTPut1 (ZWasZ$ + " not found - omitted") : _
            FOR WasK = WasI + 1 TO ZLastIndex : _
               ZUserIn$(WasK - 1) = ZUserIn$(WasK) : _
            NEXT : _
            ZLastIndex = ZLastIndex - 1 : _
            WasI = WasI - 1
         WasI = WasI + 1
      WEND
      ZWasQ = ZLastIndex
'print "end 58188 zlastindex=";zlastindex;" zok=";zok
      RETURN

------------------------[ KG062301]-------------------------

Problem:  When you stack message numbers, Read reads exactly those
messages.   But S)can and T)opic do not confine themselves to the
numbers.  Instead, "s 5" acts like "s 5+".

Solution:  Change RBBS-PC.BAS as follows:

4380 WasA1$ = "Msg #" + _
           STR$(LowMsgNumber) + _
           "-" + _
           MID$(STR$(ZMsgPtr(ActiveMessages,2)),2) + _
           " (H)lp,S)ince,L)ast" + _
           LEFT$(",G)lobal",8*(ZLinkedConf$ ="" OR ZGlobalRead)+8)
     CALL SkipLine (-QuickScanMsgs)                                  ' KG062301
     IF ZGlobalRead THEN _
        CALL QuickTPut1 ("Reading globally")
     IF AddressedToUser OR ToRequested OR FromRequested THEN _
        ZWasY$ = LEFT$("TO",-2*(ToRequested OR AddressedToUser)) + _
             LEFT$("/",-AddressedToUser) + _
             LEFT$("FROM",-4*(FromRequested OR AddressedToUser)) : _
        CALL QuickTPut1 ("Include only msgs "+ZWasY$+" you.  Read what msgs (? for help)") _
     ELSE WasA1$ = WasA1$ + ",T)o,F)rom,M)" : _
          IF ReadMsgs AND ZMarkedMsgs$ <> "" THEN _
             WasA1$ = WasA1$ + "arked" _
          ELSE WasA1$ = WasA1$ + "ine"
     IF SearchString$ = "" THEN _
        WasA1$ = WasA1$ + _
             ", text" _
     ELSE CALL QuickTPut1 ("Include only msgs with text " + SearchString$ + ".  Read what msgs (? for help)")

4418 ZWasA = INSTR("FfTt",ZUserIn$(ZAnsIndex))
     IF ZWasA > 0 THEN _
        ToRequested = (ZWasA > 2) : _
        FromRequested = (ZWasA < 3) : _
        GOTO 4370
     IF CurMsg = 0 THEN _
        IF SearchHeader$ <> "" THEN _
           GOTO 4370 _
        ELSE SearchString$ = ZUserIn$(ZAnsIndex) : _
             SearchCt = 0 : _
             CALL AllCaps (SearchString$) : _
             CALL Remove (SearchString$,CHR$(34) + CHR$(39)) : _
             SearchHeader$ = SearchString$ : _
             SubInHeader$ = SearchHeader$ : _
             GOTO 4370
     CALL SkipLine (-ReadMsgs)                                       ' KG062301

4630   CALL AskMore (",M)ark, #(s) to read",ZTrue,ZTrue,WasXX,ZFalse)
       IF ZWasQ = 0 OR ZYes THEN _
          GOTO 4631
       IF ZNo THEN _
          RETURN
       IF ZSubParm = -1 THEN _
          RETURN 10595
       IF ZRet THEN _
          RETURN
       ZWasZ$ = ZUserIn$(1)
       CALL AllCaps (ZWasZ$)
       IF ZWasZ$ = "M" THEN _
          ZLastIndex = ZWasQ : _
          ZAnsIndex = 1 : _
          CALL AskItems ("M",ZWasZ$,ZTrue,"msg",ZMarkedMsgs$)
       IF VAL(ZWasZ$) > 0 THEN _
          FOR WasI = ZWasQ TO 1 STEP -1 : _
             ZUserIn$(WasI + 1) = ZUserIn$(WasI) : _
          NEXT : _
          ZUserIn$(1) = MID$(ZAllOpts$,INSTR(ZOrigCommands$,"R"),1) : _
          ZLastIndex = ZWasQ + 1 : _
          ZAnsIndex = 1 : _
          RETURN 1235                                                ' KG062301
4631   IF NOT Forward AND NOT Reverse THEN _                         ' KG062301
          GOTO 4370                                                  ' KG062301
        CALL CheckCarrier                                            ' KG062301
       IF ZSubParm THEN _
          RETURN 10595
       IF ZRet THEN _
          RETURN

