STRUCTP.101

52 KB 59dcc03aa6ef9b85…
(*  Ezycom Structures  (C) Peter Davies.  All Rights Reserved.
    Revised for Ezycom V1.01 09/05/1992.

    May be freely used by 3rd Party Developers for Ezycom.

    Written permission must be granted by Peter Davies for
    non-third party use. *)

(*  Pascal to C
    typedef char unsigned byte;
    typedef int  unsigned word;
    typedef char unsigned boolean;
    typedef long signed   longint;

     All Strings require one extra character.
     The first field of a string [0] is the length of the string *)

(*   Turbo Pascal defines

     DateTime = Record
        Year,
        Month,
        Day,
        Hour,
        Min,
        Sec   : word;
     end; *)

const
    version      = '1.01';
    productname  = 'Ezycom';
    versionhigh  = 1;
    versionlow   = 1;
    copyright    = 'Peter Davies';
    maxfree      = 685;
    userfree     = 35;
    maxnodes     = 128;
    maxaka       = 16;
    maxmess      = 400;
    maxmessall   = 500;
    maxfile      = 400;

    (* Message Types *)

    localmail = 0;
    netmail   = 1;
    echomail  = 2;
    passthru  = 3;
    waitthru  = 4;
    allmail   = 5;

    (* Ask Types *)

    askyes    = 0;
    askno     = 1;
    askask    = 2;

    (* Phone Types *)

    business  = 0;
    data      = 1;
    nophone   = 2;

    (* File Size Types *)

    nosize    = 0;
    sizebytes = 1;
    sizekilobytes = 2;

    (* Message Kinds Type *)

    public        = 0;
    private       = 1;
    privatepublic = 2;

    (* Swapping Types *)

    SwapwithNone   = 0;
    SwapwithEMS    = 1;
    SwapwithXMS    = 2;
    SwapwithDISK   = 3;
    SwapwithEMSXMS = 4;
    SwapwithXMSEMS = 5;

    (* Toss Attribute 1 *)
    msgdupedetect     = 3;
    msgdeletenetmail  = 4;
    msgechoarearecpt  = 5;
    msgimportnetsysop = 7;

    (* Toss Attribute 2 *)
    msgkillbadarchive = 2;

    (* User Attributes *)
    usr1deleted          = 0;
    usr1clrscr           = 1;
    usr1moreprompt       = 2;
    usr1ansicapable      = 3;
    usr1nokill           = 4;
    usr1filepointignore  = 5;
    usr1fullscreened     = 6;
    usr1quietmode        = 7;
    usr2ignorefileratios = 0;
    usr2ibmextended      = 1;
    usr2dateformat       = 2;
    usr2ignorepaging     = 3;
    usr2excludeuser      = 4;
    usr2avatarcapable    = 5;
    usr2ignoretime       = 6;
    usr2ignoremessratio  = 7;
    usr3nopagesound      = 0;
    usr3pageatlogon      = 1;
    usr3holdmailbox      = 2;

type
     asktype        = byte;
     phonetype      = byte;
     msgtype        = byte;
     msgkindstype   = byte;
     showfilesizetype = byte;
     maxstr         = string[255];
     userstring     = string[35];
     date           = string[8];
     str2           = string[2];
     str3           = string[3];
     str8           = string[8];
     str12          = string[12];
     str30          = string[30];
     file8          = str8;
     flagtype       = array[1..4] of byte;
     grouptype      = array[1..4] of byte;

     daterecord     = record
        year        : word;
        month       : byte;
        day         : byte;
     end;

     securityrecord = record
                     security : word;
                     onflags  : flagtype;
                     offflags : flagtype;
     end;

     netrecord      = record
                     zone,
                     net,
                     node,
                     point   : word;
     end;

    (* **********************************************************

       Filename:    <configrec.userbasepath>USERS.BBS

       Description: Users File
                    Records in parrallel with USERSEXT.BBS

       Limitations: 65536 records (users) maximum

       ********************************************************** *)

        usersrecord    = record
           name           : userstring;
           alias          : userstring;
           password       : string[15];
           security       : word;
           attribute,
              (* Bit 0 : Deleted
                     1 : Clear Screen
                     2 : More Prompt
                     3 : Ansi Capable
                     4 : Don't Kill User
                     5 : File Points Ignore
                     6 : Full Screen Ed
                     7 : Quiet Mode        *)
           attribute2,
              (* Bit 0 : Ignore File Ratios
                     1 : Extended IBM Characters
                     2 : On = MMDDYY Off = DDMMYY
                     3 : Ignore Paging Hours
                     4 : Exclude User
                     5 : Avatar Capable
                     6 : Ignore Menu Time Restrictions
                     7 : Ignore Message Ratios         *)
           attribute3,
              (* Bit 0 : Do Not Sound Page
                     1 : Page on Logon
                     2 : Hold Mailbox
                   3-7 : [Reserved] *)
           attribute4     : byte;
              (* Bit 0-7 : [Reserved] *)
           flags          : FlagType;
           dataphone,
           voicephone     : String[14];
     end;


    (* **********************************************************

       Filename:    <configrec.userbasepath>USERSEXT.BBS

       Description: Extended Users Information
                    Records in parrallel with USERS.BBS

       Future:      V1.02 Structure size increasing to 320 bytes

       ********************************************************** *)


        usersextrarecord = record
           location       : string[25];
           lasttimedate   : longint;
              (* DOS Packed Date/Time *)
           credit,
              (* Users netmail credit *)
           pending        : word;
              (* Netmail cost pending export *)
           msgsposted,
           nocalls,
           uploads,
           todayk,
           timeused,
           downloads      : word;
           uploadsk,
           downloadsk     : longint;
           screenlength   : byte;
           lastpwdchange  : byte;
           timebanked,
           ksbanked,
           filepoints     : word;
           qwkcompression : byte;
           qwkdaysold     : byte;
           comment        : string[40]; (* Sysop/User Comment *)
           colour1_2,  (* To retrieve the first colour AND 15
                          To retrieve the second colour SHR 4  *)
           colour3_4,
           colour5_6,
           colour7_8,
           bkcolour        : byte;
           sessionfailures : byte; (* Number of Session Failures since last
                                      successful logon *)
           topmenu        : str8; (* User's Top Menu *)
           filepointsgiven : word;
              (* Number of Filepoints credited since last logon *)
           dateofbirth    : daterecord;
           groups         : grouptype; (* user's group setting (compressed) *)
           regodate,                   (* Start of Registration *)
           firstdate,                  (* Date of First Logon *)
           lastfiledate   : word; (* Last Time a New Files Search was done *)
           defprotocol    : char; (* Blank means no default protocol *)
           timeleft       : word; (* Users remaining time for today *)
           filearea       : word; (* Last file area user used *)
           messarea       : word; (* Last message area user used *)
           usernumbermsb,
           usernumberlsb  : longint;
              (* Both Most Significant and Least Significant
                 User Numbers together make a totally unique
                 user identification number.  This should be
                 used by door writers to save space, instead
                 of storing the full users name.  Obviously
                 not all doors would fit into this category,
                 but most should *)
           qwkmaxmsgs     : longint;
           qwkmaxmsgsperarea : word;
           extraspace     : array[1..userfree] of byte;
        end;

    (* **********************************************************

       Filename:     <userbasepath>LASTCOMB.BBS

       Description:  Used be Ezycom to lastread & combined info

       Note:         This record adjusts when the number of
                     conferences change (in steps of 16).
                     Eg: 16 conferences takes up HALF of the
                          diskspace of 32 conferences


       ********************************************************** *)

        userslastrecord = record (* LASTCOMB.BBS *)
           combinedinfo    : word;
           lastreadinfo    : array[0..15] of word;
        end;


    (* **********************************************************

       Filename:    <configrec.menupath>????????.MNU

       Description: Menu Structure
                    Record 0 has a different record structure

       Limitations: 51 records maximum

       ********************************************************** *)


     mnurecord      = record (* *.MNU *)
                     typ            : byte;
                     security       : word;
                     flags          : flagtype;
                     display        : string[90];
                     hotkey         : char;
                     (* Ctrl-A means Automatic Option *)
                     miscdata       : string[90];
                     foreground,
                     background     : byte;
                     timeonline     : byte;
                     timestart      : word;
                     timeend        : word;
                     (* Hours is "* 100" *)
                     attribute      : byte;
                     (* bit 0 : Test Ratio K
                        bit 1 : Test Message/Call Ratio
                        bit 2 : Test Age <config age> and Over
                        bit 3 : Test Ratio Files
                        bit 4-7 [ Reserved ] *)
                     node           : byte;
                   end;

    (* **********************************************************

       Filename:    PROTOCOL.EZY

       Description: Protocol Record Structure

       Limitations: 60 records maximum

       ********************************************************** *)


    protocolrecord = record (* PROTOCOL.EZY *)
                     name             : string[15];
                     activekey        : char;
                     attribute        : byte;
                     (* bit 0 = enable/disable
                        bit 1 = batch protocol
                        bit 2 = [ Reserved ]
                        bit 3 = both directions
                        bit 4 = up/down
                        bit 5 = bidirectional
                        bit 6-7 [ Reserved ] *)
                     logfilename,
                     ctlfilename,
                     dnctlstring      : string[60];
                     dncmdstring,
                     upcmdstring      : string[100];
                     uplogkeyword,
                     dnlogkeyword,
                     uperrkeyword,
                     dnerrkeyword,
                     uperr2keyword,
                     dnerr2keyword    : string[10];
                     xfernamewordnum  : Byte;
                     xfercpswordnum   : byte;
                     security         : word;
                     flags            : flagtype;
                     efficiency       : byte;
                   end;


     configrecord = record (* CONFIG.EZY *)
                     version      : string[8];
                     system       : string[40];
   (* Constant *)    sysop        : userstring;
                     logpath,
                     textpath,
                     menupath,
                     mnurampath,
                     netmailpath,
                     nodelistpath,
                     msgpath,
                     filepath,
                     editorpath,
                     bipath,
                     temppath,
                     userbasepath,
                     avatarpath,
                     ascpath,
                     asclowpath,
                     filemaint,
   (* Unused *)      fileattachpath,
                     soundpath,
                     fastindexpath : string[60];
                     systempwd,                 (* Password to Logon System *)
                     sysoppwd,                  (* Password to Sysop Functions *)
                     newuserpwd   : string[15]; (* Password for Newuser *)
                     newtopmenu   : str8;       (* NewUser TopMenu *)

   (* Unused *)      freespace2   : longint;

                     inboundmail,
                     outboundmail,
                     uploadpath,
                     swapfile,
                     multipath    : string[60];
   (* Not in 1.02 *) brackets     : string[2];
                     inactivitytime,
                     minmesscheck,
                     maxlogintime : byte;
   (* Constant *)    multiline    : boolean;
                     answerdelay  : byte;
                     shellswap,
                     highbit,
                     disppass,
                     asklocalpass,
                     fastlogon,
                     sysopremote,
                     printerlog,
                     phone1ask,
                     colourask,
                     aliasask,
                     dobask,
                     phoneforce,
                     direct_video,
                     snow_check   : boolean;
                     swaponezymail : byte;
                     screen_blank : byte;
                     oneword      : boolean;
                     checkmail,
                     checkfile,
                     ansiask,
                     fullscreenask,
                     clearask,
                     moreask,
                     avatarask,
                     extendask,
                     usdateask    : asktype;
                     phone2ask    : boolean;
                     phoneformat  : string[14];
                     nameprompt,
                     pwdprompt,
                     shellprompt,
                     shell2prompt,
                     enterprompt,
                     chatprompt,
                     listprompt,
                     graphicprompt,
                     fseprompt,
                     moreprompt,
                     waitphone,
                     chat2prompt,
                     screenlengthprompt,
                     screenclearprompt,
                     locationprompt,
                     userscanprompt,
                     loadprompt,
                     avatarprompt,
                     aliasprompt  : string[60];
                     security,
                     logonsecurity : word;
                     flags         : flagtype;
                     minpasslength,
   (* Constant *)    dispfwind,
   (* Constant *)    dispbwind,
   (* Constant *)    disppopupf,               (* Popup Forground  *)
   (* Constant *)    disppopupborder,          (* Popup Border     *)
   (* Constant *)    disppopupb,               (* Popup Background *)
   (* Constant *)    dispf,
                     newusercol1,
                     comport,
                     passlogons   : byte;
                     doblogon     : byte;
                     printerport,
                        (* 0 : LPT1
                           1 : LPT2
                           2 : LPT3
                           3 : COM1
                           4 : COM2
                           5 : COM3
                           6 : COM4  *)
                     passtries      : byte;
                     topmenu        : string[8];
                     maxtimebank,
                     maxksbank,
                     watchmess,
                     netmailcredit,
                     ansiminbaud,
                     fileminbaud,
                     slowbaud,
                     minloginbaud   : word;
                     lowsecuritystart,
                     lowsecurityend,
                     slowstart,
                     slowend        : word;
                     quotestring    : string[5];
                     unknownarea    : byte;
                        (* 0 : Kill Messages
                           1 : Make a New EchoMail Area
                           2 : Make a New PassThru Area *)
   (* Not in 1.02 *) SBIrq             : byte;
                     forcecrashmail,
                     optioncrashmail,
                     netmailfileattach : word;
   (* Constant *)    popuphighlight    : byte;     (* Popup Highlight *)
   (* Constant *)    tossattr2         : byte;
                        (* Bit 0 : Route Mail (Off = Direct)
                               1 : [Reserved]
                               2 : Kill Bad Archives
                               3 : ARCMail 0.6 compat
                               4-7 [Reserved] *)
                     maxpages,
                     maxpagefiles,
                     pagelength     : byte;
                     pagestart      : array[0..6] of word;
                     pagemessboard,
                        (* Message Board for Paging (0=Not In Use) *)
   (* Unused *)      localfattachsec,
   (* Unused *)      sectouploadmess,
                     sectoupdateusers,
                     readsecnewecho,
                     writesecnewecho,
                     sysopsecnewecho,
                     secreplyvianetmail : word;
                     netmailkillsent    : asktype;
                     swaponarchive      : byte;
   (* Constant *)    qwkfilename    : str8; (* QWK Unique Filename *)
   (* Constant *)    popuptext      : byte;           (* Popup Text *)
                     pageend        : array[0..6] of word;
   (* Constant *)    newareagroup   : array[1..16] of char;
   (* Constant *)    qwkmaxmail     : longint;
                     badmsgboard,
                     incomingcallstart,
                     incomingcallend : word;
   (* Not in 1.02 *) SBHex          : word;
                        (* Sound Blaster Hex Address *)
                     altf           : array[1..10] of string[60];
                     ctrlf          : array[1..10] of string[40];
   (* Constant *)    maxmess,
   (* Constant *)    maxfile,
                     fp_credit      : word; (* Newuser Filepoints *)
                     ks_per_fp,             (* Number of Kilobytes per FP *)
                     fp_upload,             (* Filepoints Upload Credit *)
                     rego_warn_1,
                     rego_warn_2    : byte;
                     badpwdmsgboard : word;
                        (* Failed Logon Message Board to Sysop (0=Off) *)
                     min_space_1    : word;
                     swapbimodem    : boolean;
                     modembusy      : boolean; (* Toggle DTR or ATH1 *)
                     scrheight      : boolean; (* 43/50 line mode *)
   (* Not in 1.02 *) msgtmptype     : boolean;
                        (* True  = MSGTMP
                           False = MSGTMP.<node> *)
                     swapupload     : boolean;
                     phonelogon     : byte;
                     carrierdetect  : byte; (* Carrier Detect (Default=$80) *)
                     newfileshighlight : boolean;
  (* Word in 1.02 *) max_descrip    : byte;
                     min_descrip    : byte;
                     requestreceipt : word;
                     ushowdate      : boolean;
                     ufilesizek     : showfilesizetype;
                     uuploader,
                     udownloadcount,
   (* Unused *)      freespace11,
                     ushowsecurity,
                     sshowdate      : boolean;
                     sfilesizek     : showfilesizetype;
                     suploader,
                     sdownloadcount,
   (* Unused *)      freespace10,
                     sshowsecurity,
                     ushowtime,
                     ushowfp,
                     sshowtime,
                     sshowfp         : boolean;
                     fp_percent      : word; (* Download Filepoints Credit *)
                     autodetect      : byte;
                        (* Bit 0 : Auto Detect ANSI
                               1 : ANSI Detect for NewUser
                               2 : Auto Detect IEMSI
                               3 : IEMSI Detect for NewUser
                               4-7 [Reserved] *)
                     dispsecurityfile,
                     askforpagereason,
                     delincompletefiles,
   (* Unused *)      externalconvert  : boolean;
   (* Constant *)    swaponfeditview  : byte;
   (* Unused *)      freespace13,
                     secfileschar,
                     passchar,
   (* Not in 1.02 *) highbitchar     : char;
   (* Unused *)      conversiononmaster : byte;
   (* Not in 1.02 *) leftbracket     : string[1];
   (* Not in 1.02 *) rightbracket    : string[1];
                     ignorefp        : word; (* Min Security to Ignore FPs *)
                     menuminage      : byte; (* Minimum Age for Age Checks *)
   (* Constant *)    killnullnetmail : boolean;
                     modemeff        : array[1..11] of word;
                     modembaud       : array[1..11] of word;
                     modemconnect    : array[1..11] of string[15];
                     modemerr        : array[1..11] of byte;
   (* Constant *)    tossattr        : byte;
                        (*  Bit 0-2 [Reserved]
                                3 : Dupe Detection
                                4 : Delete Netmail on Import
                                5 : Keep EchoArea Node Receipts
                                6 : Allow Message Rescan
                                7 : Import Messages to Sysop *)
                     usercol1_2,
                     usercol3_4,
                     usercol5_6,
                     usercol7_8,
                     userbkcol       : byte;
                     newusercol2     : byte;
                     chstatcol       : byte;
                     getentercol     : byte;
                     usdateforsysop  : boolean;
                     ezyovrpath      : string[60];
                     sysopalias      : userstring;
                     ovrems          : boolean;
                     swapezy         : byte;
                     filesecpath     : string[60];
   (* Unused *)      scanvirus       : boolean;
                     multitasker     : byte;
                     (*  0 = Do Not Detect or Use Any MultiTasker
                         1 = Auto-Detect
                         2 = Desqview
                         3 = Double DOS
                         4 = OS 2
                         5 = MultiDOS Plus
                         6 = Taskview
                         7 = Topview
                         8 = PC MOS
                         9..255 [Reserved] *)
                     maxbaud         : word; (* longint in 1.02 *)
                     lockedport      : boolean;
                     filereqsec      : word;
                     autoanswer      : boolean;
                     initresponse    : string[10];
                     ringstring      : string[10];
                     inittries       : byte;
                     initstring1     : string[60];
                     initstring2     : string[60];
                     busystring      : string[20];
                     answerstring    : string[20];
                     mailerstring    : string[60];
                     modemstart      : word;
                     modemend        : word;
                     modemdelay      : byte;
                     sendbreak       : boolean;
                     externaleditor  : string[60];
                     defaultorigin   : string[50];
   (* Constant *)    newareastmess   : array[1..16] of word;
                        (* New Area Start Message Board *)
                     uploadcredit    : word;
                        (* Upload Credit Percentage *)
                     systemlocation  : string[35];
                     shownewfileschar : byte;
                        (* 0 - No
                           1 - ASCII Only
                           2 - Always *)
   (* Constant *)    zone            : array[1..16] of word;
                     net             : array[1..16] of word;
                     node            : array[1..16] of word;
                     point           : array[1..16] of word;
                        (* V1.02 this will be:  netaka : array[1..16] of netrecord; *)
   (* Constant *)    netmailboard    : array[1..16] of word;
   (* Constant *)    domain          : array[1..16] of string[20];
                     nocarrierstring : string[20];
                     guestaccount    : userstring;
                     freespace       : array[1..maxfree] of byte;
                  end;

        (* Note: Strings that are marked CONSTANT, should be constant
           across all CONFIG.XXX. *)

        compressrecord = record
           echounarccmd    : array[0..5] of String[12];
           echounarcpar    : array[0..5] of String[18];
           echoarccmd      : array[0..6] of String[12];
           echoarcpar      : array[0..6] of String[18];
        end;

        stringrecord = record
           compress : compressrecord;
        end;

        limitsrecord = record (* LIMITS.EZY *)
           security    : word; (* Security level *)
           time        : word; (* Time limit per day *)
           limit       : array[1..11] of word;
           ratio       : byte; (* File Ratio *)
           credit      : word; (* File Ratio Credit *)
           ratiok      : byte; (* Kilobyte Ratio *)
           creditk     : word; (* Kilobyte Ratio Credit *)
           regodays    : word; (* Registration in Days *)
           creditmess  : word; (* PCR Credit *)
           mess        : word; (* PCR (%) *)
           timepercall : word; (* Time limit per call   0=Disabled *)
           callsperday : byte; (* Maximum Calls Per Day 0=Disabled *)
           freespace   : byte;
        end;

        filepathrecord = record (* FILEPATH.EZY *)
           filepath    : string[60];
           security    : word;
           flags       : flagtype;
           uploadarea  : word;
           password    : string[8];
           attribute   : byte;
              (* Bit 0 = CD Rom Path
                     1 = Show as Not Found
                     2 = Free Downloads
                     3 = Age Check
                     4-7 [Reserved] *)
        end;

        filesecrecord = record (* FILESEC.EZY *)
           filename    : string[12];
           security    : word;
           flags       : flagtype;
           password    : string[8];
           attribute   : byte;
             (*  Bit 0 = [Reserved]
                     1 = Show as Not Found
                     2 = Free Downloads
                     3 = Age Check
                     4-7 [Reserved] *)
        end;

        filelistrecord = record (* FILEXXX.EZY *)
           filename    : string[12];
           description : string[50];
           fsize       : longint;
           fdate       : word;
           attribute   : byte;
              (* Bit 0 : checked
                     1 : [Reserved]
                     2 : offline
                     3 : [Reserved]
                     4 : private
                     5 : deleted
                     6 : [Reserved]
                     7 : security *)
           attribute2  : byte;
              (* bit 0-7 [Reserved] *)
           uploader    : userstring;
           downloads   : word;
        end;

        filerecord = record (* FILES.EZY *)
           name        : string[30];
           attribute,
              (* bit 0 : keep files offline
                     1 : offline allowed
                     2 : sortby date
                     3 : sortby alpha
                     4 : master list
                     5 : Age Check to View
                     6-7 [ Reserved ] *)
           convert     : byte;
              (* 0     : none
                 1     : zip
                 2     : lzh
                 3     : arj
                 4     : pak
                 5     : arc
                 6     : zoo
                 7-255 : [ Reserved ] *)
           filegroup   : char;
           uptemplate,
           upfilepath  : word;

           freespace   : longint;

           security    : word;
           flags       : flagtype;
           syssecurity : word;
           sysflags    : flagtype;
        end;

        predownloadrecord = record (* EZYDOWN.<node> *)
           filename      : string[12];
           locationfile  : maxstr;
           fsize         : longint; (* KiloBytes *)
           freedown      : boolean;
           timetodown    : longint; (* Seconds *)
           deleted       : boolean;
        end;

        preuploadrecord = record  (* EZYUP.<node> *)
           filename      : string[12];
           description   : string[50];
           isdupe        : boolean;
        end;

        maint_record = record (* MAINT1.BBS, MAINT2.BBS *)
           filename      : string[12];
           filepoint     : word;
           downloader    : userstring;
           uploader      : userstring;
        end;

        fastpointerrecord = array[1..730] of longint; (* FFPTR.EZY *)

        fastindexrecord = record (* FFIDX.EZY *)
           name     : string[12];
           template : word;    (* Filearea 1 -> *)
           deleted  : boolean;
        end;

    (* **********************************************************

       Filename:     <multipath>ONLINE.BBS

       Description:  Used by Ezycom to store online information

       Minimum Size: 1 Record
       Maximum Size: 250 Records

       ********************************************************** *)

        onlinerecord   = record
           name     : userstring;
           alias    : userstring;
           status   : byte;
           (* 0 - Active
              1 - [Reserved]
              2 - Downloading
              3 - Uploading
              4 - BiModem
              5 - Message Browsing
              6 - Door
              7 - Chat with Sysop
              8 - Chat with Other Users Channel 000
              ...................................
            207 - Chat with Other Users Channel 199 (200 channels)
            208 - 252 [Reserved]
            253 - Node Not Active in Any Way
            254 - User Logging On
            255 - Waiting for Caller *)
           attribute : byte;
           (* Bit 0 - Quiet Do Not Disturb *)
           baud     : longint;
           location : string[25];
        end;

    (* **********************************************************

       Filename:     <multipath>MESSNODE.<node>

       Description:  Used by Ezycom for conferencing

       Minimum Size: 0 Records (Maybe not present!)
       Maximum Size: Unlimited

       Sharing:
            Writing: Denynone + WriteOnly
            Reading: Denyall + ReadWrite (Truncate after read)

       ********************************************************** *)

        multimessagerecord = record
            from           : userstring;
            message        : string[80];
            private        : boolean;
        end;

    (* **********************************************************

       Filename:     <userbase>BESTSTAT.BBS

       Description:  Used by Ezycom to store best user stats

       Minimum Size: 0 Records (Maybe not present!)
       Maximum Size: 200 Records

       ********************************************************** *)

        bestuserrecord     = record
           bestname       : array[1..7] of userstring;
           (* BestName[1] is for BestMessages
              BestName[2] is for BestCalls
              .....
              BestName[7] is for BestDownK *)
           bestmessages,
           bestcalls,
           bestups,
           bestdns,
           bestfps        : word;
           bestupk,
           bestdownk      : longint;
        end;

    (* **********************************************************

       Filename:     <msgpath>\AREA<<area-1>/4+1>\MSGH<area>.BBS

       Description:  Used by Ezycom to store message text

       ********************************************************** *)

        msghdrrecord   = record
           prevreply,
           nextreply      : word;
              (* 0 = No Reply Chain *)
           startposition,
              (* Physical Start Position in MSGT???.BBS *)
           messagelength  : longint;
             (* Message Length including Null Terminator *)
           destzone,
           destnet,
           destnode,
           destpoint,
              (* V1.02 this will be DestNet *)
           origzone,
           orignet,
           orignode,
           origpoint,
              (* V1.02 this will be OrigNet *)
           cost           : word;
           msgattr,
              (*  Bit 0 : Deleted
                      1 : Netmail pending export
                      2 : [Reserved]
                      3 : Private
                      4 : Received
                      5 : Echomail pending export
                      6 : Locally generated msg
                      7 : Do not kill message *)
           netattr,
              (*  Bit 0 : Kill/sent
                      1 : Sent
                      2 : File Attach
                      3 : Crash
                      4 : File Req
                      5 : Request Receipt
                      6 : Audit Request
                      7 : Is a Return Receipt *)
           extattr   : byte;
              (*  Bit 0-7 [Reserved] *)
           posttimedate : longint;
              (* DOS Format Packed DateTime *)
           recvtimedate : longint;
              (* DOS Format Packed DateTime *)
           whoto,
           whofrom        : userstring;
           subject        : string[72];
        end;

    (* **********************************************************

       Filename:     <msgpath>\AREA<<area-1>/4+1>\MSGT<area>.BBS

       Description:  Used by Ezycom to store message text

       ********************************************************** *)

        (* Message Text

                Each text part of the message starts at 'startposition',
           and continues on until a NULL terminator is found, or end
           of file is reached (shouldn't happen, but just in case).  The
           message text length is limited by Turbo Pascal to 16 Meg
           in size.  Each message is contained of plain text, with 0x08D
           terminators for wrapped lines or 0x0D terminators for hard
           carriage returns *)

    (* **********************************************************

       Filename:     <msgpath>MSGFAST.BBS

       Description:  Used by Ezycom for mail checks

       ********************************************************** *)

        msgfastrecord  = record
           whoto     : longint;
              (* standard 32 Bit CRC on whoto in MSGH???.BBS
                 Username is CRCd in UPPERCASE, and does not
                 include null terminator or "white space" *)
           msgboard  : word;
           msgnumber : word;
        end;

    (* **********************************************************

       Filename:     <msgpath>MSGEXPRT.BBS

       Description:  Used by Ezycom to tell EzyNet/EzyMail whether
                     an area needs scanning or not

       ********************************************************** *)

        needscan = boolean;

        needscanrecord = array[1..maxmess] of needscan;


    (* **********************************************************

       Filename:     <systempath>MESSAGES.EZY

       Description:  Used by Ezycom to store message areas

       Size:         500 records

       ********************************************************** *)

        messagerecord  = record (* MESSAGES.EZY *)
           name           : string[30];
           areatag        : string[30];
           typ            : msgtype;
           msgkinds       : msgkindstype;
           attribute,
           (* Bit 0 : Allow Aliases
                  1 : Use Alias
                  2 : Use Alias, Ask for Aliases
                  3 : Test Age (use config age)
                  4 : Combined Area Access
                  5 : Local File attaches
                  6 : Keep Private Bit on Incoming EchoMail
                  7 : [Reserved] *)
           attribute2,
           (* Bit 0 : Show Seenby Lines
                  1 : [Reserved]
                  2 : Strip Forward Seenbys
                  3-4 [Reserved]
                  5 : Areafix Info Visible
                  6 : Initial Combined Area Access
                  7 : [Reserved] *)
           attribute3     : byte;
           dayskill,
           recvkill       : byte;
           countkill,
           kilobytekill,
           readsecurity   : word;
           readflags      : flagtype;
           writesecurity  : word;
           writeflags     : flagtype;
           sysopsecurity  : word;
           sysopflags     : flagtype;
           originline     : string[50];  (* Not in V1.02 *)
           originaddress  : byte;
           seenby         : array[1..maxaka div 8] of byte;
           areagroup,
           messgroup      : char;
           destnodes      : array[1..maxnodes div 8] of byte;
           (* Nodes  1 to  8 - DestNode[1]
              Nodes  9 to 16 - DestNode[2]
              Nodes 17 to 24 - DestNode[3]
              etc *)
           echomailfeed   : byte;
           (* 0=No Uplink *)
        end;

    (* **********************************************************

       Filename:     <systempath>ECHOMGR.EZY

       Description:  Used by Ezycom to store node information

       Size:         128 records

       ********************************************************** *)

        echomgrrecord = record
           destpoint,
           destnode,
           destnet,
           destzone : word;
              (* V1.02 this will be: destnet : netrecord *)
           groups   : string[26];
              (* V1.02 this will be: groups  : array[1..4] of byte *)
           compress : byte;
           (* 0 : Compress to ZIP
              1 : Compress to LZH
              2 : Compress to ARJ
              3 : Compress to ARC
              4 : Compress to PAK
              5 : Compress to ZOO
              6 : Compress to LZH (Using LHA Old method though) *)
           attribute   : byte;
           (* Bit 0 : Node Active
                  1 : Crash Mail
                  2 : Hold Mail
                  3 : Can Create New Echos
                  4 : Add to Export on New Echo
                  5-7 [Reserved] *)
           passwordto,
           passwordfr  : string[20];
           dayshold,
           sendpkttype : byte;
           (* 0 : Type 2
              1 : Type 2+
              2-255 [Reserved] *)
        end;

    (* **********************************************************

       Filename:     EVENTS.EZY (multinode file)

       Description:  Used by Ezycom to event information

       Minimum Size: 1 record
       Maximum Size: 65000 records

       ********************************************************** *)


        eventrecord = record
           attribute   : byte;
              (* Bit 0 = Enabled *)
           starttime   : word;
              (* Hi  Bit = Hour
                 Low Bit = Min *)
           errorlevel  : byte;
           days        : byte;
              (* Bit 0 : Sunday
                     1 : Monday
                         ...
                     6 : Saturday
                     7 : [ Reserved ] *)
           lasttimerun : word;
        end;

    (* **********************************************************

       Filename:    <systempath>TODAY.BBS
                    <systempath>YESTER.BBS

       Description: Used by Ezycom to today's/yesterday's callers

       ********************************************************** *)

       ontodayrecord = record
          line        : byte;
          name        : userstring;
          alias       : userstring;
          location    : string[25];
          baudrate    : word;
          logontime   : word;
          logofftime  : word;
          didwhat     : byte;
          (* Bit 0 : (N) NewUser
                 1 : (U) Upload
                 2 : (D) Download
                 3 : (R) Read Mail
                 4 : (S) Sent Mail
                 5 : (O) Outside
                 6 : (C) Chat
                 7 : (P) Paged *)
       end;

    (* **********************************************************

       Filename:    <systempath>TIME<node>.BBS

       Description: Used by Ezycom to store usage information

       ********************************************************** *)

       useagerecord  = record
          startdate      : word;
          busyperhour    : array[0..23] of longint; (* Minutes Used *)
          busyperday     : array[0..6]  of longint; (* Minutes Used *)
       end;

    (* **********************************************************

       Filename:    <systempath>MSGINFO.<node>

       Description: Used by Ezycom and EzyEdit to interface to
                    each other

       ********************************************************** *)

       fserecord      = record       (* MSGINFO.<node> *)
          whofrom      : userstring; (* User Who wrote message *)
          orignet      : netrecord;  (* From Net Address *)
          whoto        : userstring; (* User Who message is to *)
          destnet      : netrecord;  (* To Net Address *)
          subject      : string[72]; (* Subject of message *)
          returnstatus : byte;       (* Return Status *)
          (*   0 : FSE Record Not Used
               1 : Message Saved
               2 : Message Aborted
               3 : User  Inactivity
               4 : User  Hungup
               5 : Sysop Hungup
           6-255 : Reserved *)
          attribute    : byte;
          (*   Bit 0 : Can Change Subject
                   1 : Can Change Whoto
                   2 : Can Change Private
                   3 : Private Message
                   4 : Is Message Forwarded (False = Quoted)
                       (Providing MSGTMP.<node> exists)
                   5 : Netmail Message
                   6 : [Reserved]
                   7 : EchoMail Message *)
       end;



    (* **********************************************************

       Filename:    <msgbasepath>MSGRSCAN.BBS

       Description: Used by EzyNet and EzyMail for Rescanning a
                    Message Area for a particular node

       ********************************************************** *)

       rescanrecord = record
          nodetorescan : byte;
          msgboard     : word;
       end;

    (* **********************************************************

       Filename:    <msgbasepath>MSGSTATS.BBS

       Description: Written by EzyMail for echomail statistics

       ********************************************************** *)

       msgstatsrecord = record
          tossedboard  : array[1..maxmessall]  of word;
             (* Number of Messages Tossed to Msg Board *)
          scannedboard : array[1..maxmessall]  of word;
             (* Number of Messages Tossed to Msg Board *)
          tossednode   : array[1..maxnodes] of longint;
             (* Number of Messages Tossed to EchoArea Node *)
       end;

    (* **********************************************************

       Filename:    <systempath>EXITINFO.<node>

       Description: Used by Ezycom in Type 15 exits to return
                    Used by Ezycom in Type 7 exits for door
                       information

       Future:      In V1.02 totally new structure as "userextra"
                       is increasing in size

       ********************************************************** *)

       exitinforecord = record
          baud           : word; (* Speed between Modem/Modem *)
          lockedbaud     : word; (* Speed between Computer/Modem *)
          comport        : byte; (* Comport 1 = Com1, etc *)
          efficiency     : word; (* Baud Rate efficiency *)
          userrecord     : word; (* User Record Number (0=User1) *)
          userinfo       : usersrecord;
          userextra      : usersextrarecord;
          sysopname,             (* Sysop's Name *)
          sysopalias     : userstring;
          system         : string[40];
          downloadlimit  : word; (* Maximum Download Limit *)
          timelimit      : word; (* Daily Time Limit *)
          timetakenevent : word;
             (* Number of Minutes Taken from User for Event *)
          timecreated    : longint;
             (* Number of Seconds since Midnight *)
          timeofnextevent   : longint;
             (* Number of Seconds since Midnight *)
          timetillnextevent : longint;
             (* Number of Seconds after Time Created *)
          dayofnextevent : byte;
             (* 0 = Sunday
                ..........
                6 = Saturday
                7 = NOEVENT *)
          errorlevelofnextevent : byte;
             (* Errorlevel to return from next event *)
          ratio          : byte; (* File Ratio *)
          credit         : word; (* File Ratio Credit *)
          ratiok         : byte; (* Kilobyte Ratio *)
          creditk        : word; (* Kilobyte Ratio Credit *)
          regodays       : word; (* Registration Days *)
          creditmess     : word; (* Post Call Ratio Credit *)
          mess           : word; (* Post Call Ratio *)
          logintimedate  : datetime; (* Login Datetime *)
          stack          : array[1..20] of str8; (* Menu Stack *)
          stackpos       : byte; (* Menu Stack Position (0 = No Stack) *)
          curmenu        : str8; (* Current Menu *)
          oldpassword    : string[15];
          limitrecnum    : word; (* Limits Record Being Used *)
          baudrecnum     : byte; (* BaudRate Record Being Used *)
          hibitreplace   : char; (* Hi-Bit Replacement Character *)
          maxpages       : byte; (* Maximum Pages *)
          pagedsysop     : byte; (* Number of Times User has Paged Sysop *)
          wantchat       : boolean;
          pagestart,
          pageend        : longint; (* Number of Seconds since Midnight *)
          pagelength     : byte; (* Page Length *)
          echoentered,
          netentered,
          nextsysop      : boolean;
          inactivitytime : word; (* Seconds *)
          protrecnum     : byte;
             (* Default Protocol Record Number 0=NoDefault *)
          protname       : string[15]; (* Default Protocol Name *)
          didwhat        : byte; (* Didwhat flag for Todays Callers *)
          pagereason     : string[60];
          mtasker        : byte;
          iemsi_session  : boolean;
          iemsi_req1,
             (* Bit 0 = News
                    1 = Mail
                    2 = File
                    3 = Clrscr
                    4 = Quiet
                    5 = More
                    6 = FSE
                    7 = [Reserved] *)
          iemsi_req2,
             (* Bit 0-7 = [Reserved] *)
          iemsi_scrlen   : byte;
             (* Screen Length for current session
                If NOIEMSI session, this is set to the
                   users screen length *)
          iemsi_prot,
             (* Bit 0 = ZModem
                    1 = SEAlink
                    2 = Kermit *)
          iemsi_crt,
             (* 0 = TTY
                1 = ANSI
                2 = AVT0+
                3 = VT100
                4 = VT52 *)
          iemsi_cap      : byte;
             (* Bit 0 = CHT
                    1 = MNU
                    2 = TAB
                    3 = ASCII8 *)
          pagesound      : boolean;
          freespace      : array[1..99] of byte;
       end;

       sysinforecord = record
          callcount      : longint;
          lastcaller     : userstring;
          filessizek     : longint; (* Updated by Ezyff -C *)
          newusers,
          newfiles,
          newmessages    : word;    (* Does NOT include Inbound Echomail *)
          lastalias      : userstring;
          laststarttime  : word;
          extraspace     : array[1..80] of byte;
       end;



const
    fnoinherit = 128;  {      No Interitence Flag }
    fdenyall   = 16;   {      These are MUTUALLY EXCLUSIVE!!!!   }
    fdenywrite = 32;   {      Only ONE of THESE SHOULD BE USED   }
    fdenynone  = 64;   {                                         }
    fdenyread  = 48;   {                                         }
    freadonly  = 0;               {     THESE ALSO!!!  }
    fwriteonly = 1;               {                    }
    freadwrite = 2;               {                    }

(*

*****************************
Sample PASCAL Source Code for
location of CONFIG, and
for date conversion.
*****************************

**************************
Returns True if file found
**************************

function find(path : maxstr) : boolean;

var
   srec : searchrec;

begin
   findfirst(path,anyfile,srec);
   if doserror = 0
      then find := true
      else find := false;
end;

****************************************************
Returns the path of where to find CONFIG

ie  findw("CONFIG") would return the path of where
it can be found.  An additionial FIND should be done
on the result, as there may not be a CONFIG in the
system dir.

itos(x : longint) is simply a function that returns
the number in a string format.

node is the variable containing the current node

systempath is the path where the environment variable
EZY points to.  If not present, it is the current
directory on start up.

****************************************************


function findw(s : maxstr) : maxstr;

begin
   if find(systempath + s + '.' + itos(node)) then
      findw := systempath + s + '.' + itos(node) else
      if find(s + '.EZY') then
         findw := s + '.EZY' else
            findw := systempath + s + '.EZY';
end;

***********************
Checks for a valid date
***********************

function checkdate(yy,mm,dd : word) : boolean;

const
   daysinmonth : array[1..12] of word =
      (31,29,31,30,31,30,31,31,30,31,30,31);

begin
   if (mm < 1) or (mm > 12) then
      begin
         checkdate := false;
         exit;
      end;
   if (dd < 1) or (dd > daysinmonth[mm]) then
      begin
         checkdate := false;
         exit;
      end;
   if (yy < 1900) then
      begin
         checkdate := false;
         exit;
      end;
   if ((yy mod 4 <> 0) and (dd = 29) and (mm=2)) then
      checkdate := false else
      checkdate := true;
end;

***********************
Converts a Date to Word
***********************

function datetoword(yy,mm,dd : word) : word;

var
   tofield        : word;
   tempbyte       : byte;

begin
   if not checkdate(yy,mm,dd) then
      begin
         datetoword := 65535;
         exit;
      end;
   tofield := dd - 1;
   tofield := tofield + ((mm - 1) shl 5);
   if (yy < 1980) or (yy > (1980 + 127)) then
      begin
         datetoword := 65535;
         exit;
      end;
   yy := yy - 1980;
   tofield := tofield + (yy shl 9);
   datetoword := tofield;
end;

***********************************
Converts a Word to a DATE

If date is ok then true is returned
***********************************

function wordtodate(temp : word;var yy,mm,dd : word) : boolean;

begin
   if (temp = 65535) then
      begin
         wordtodate := false;
         exit;
      end else
      wordtodate := true;
   dd   := temp and 31 + 1;
   temp := temp shr 5;
   mm   := temp and 15 + 1;
   temp := temp shr 4;
   yy   := (temp and 127) + 1980;
end;

*)