TELEGARD.H

42.3 KB d66e3f59c33d4d36…
/*****************************************************************************/
/*>                                                                         <*/
/*>                     Telegard Bulletin Board System                      <*/
/*>      Copyright 1988-1991 by Martin Pollard.  All rights reserved.       <*/
/*>                                                                         <*/
/*>                     Data Types and File Structures                      <*/
/*>                                                                         <*/
/*****************************************************************************/

#ifndef __TELEGARD_H
#define __TELEGARD_H

#define BBS_VER     "2.7"       /* current version number */

#define MAXBOARDS       256     /* max # of message bases */
#define MAXUBOARDS      256     /* max # of file bases */
#define MAXPROTOCOLS    120     /* max # of transfer protocols */
#define MAXEVENTS       10      /* max # of scheduled events */
#define MAXARCS         8       /* max # of archivers */
#define MAXMENUCMDS     50      /* max # of menu commands */
#define NUMVOTEAS       10      /* max # of voting question answers */
#define NUMVOTEQS       20      /* max # of voting questions */

#define ATNO            0       /* no anonymous posts allowed */
#define ATYES           1       /* anonymous posts are allowed */
#define ATFORCED        2       /* ALL posts are forced anonymous */
#define ATDEARABBY      3       /* "Dear Abby" message base */
#define ATANYNAME       4       /* users can post as ANY name they want */

#define MLOCAL          0       /* local message base */
#define MNETMAIL        1       /* NetMail message base */
#define MECHOMAIL       2       /* EchoMail message base */
#define MGROUPMAIL      3       /* GroupMail message base */

#define MPUBLIC         0       /* post public messages only */
#define MPRIVATE        1       /* post private messages only */

/*---------------------------------------------------------------------------*/

typedef unsigned char boolean;      /* Turbo Pascal "boolean" */
typedef unsigned char byte;         /* Turbo Pascal "byte" */
typedef signed short int integer;   /* Turbo Pascal "integer" */
typedef signed long int longint;    /* Turbo Pascal "longint" */
typedef unsigned char string;       /* Turbo Pascal "string" */
typedef unsigned short int word;    /* Turbo Pascal "word" */
typedef unsigned int bit;           /* shorthand for C bit fields */

/*---------------------------------------------------------------------------*/

typedef string acstring[21];        /* Access Control System string */
typedef byte acrq[4];               /* AR flags */
typedef byte clrs[2][10];           /* color records: */
                                    /* [0][x] = mono  */
                                    /* [1][x] = color */
typedef integer secrange[256];      /* security tables */

typedef byte cpackdatetime[6];              /* packed date/time */
typedef byte mzscanr[MAXBOARDS / 8];        /* msg base scan flags */
typedef byte fzscanr[MAXUBOARDS / 8];       /* file base scan flags */
typedef cpackdatetime mhireadr[MAXBOARDS];  /* last msg read table */

/*****************************************************************************/
/*                                                                           */
/*       The format of the packed date/time structure is as follows:         */
/*                                                                           */
/*                 Byte #0    |    Byte #1    |    Byte #2                   */
/*             ===============|===============|===============               */
/*             7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0               */
/*             `-----------' `-------------' `-----' `-------'               */
/*                RESERVED        Year        Month     Day                  */
/*                              (8 bits)    (4 bits) (5 bits)                */
/*                                                                           */
/*                 Byte #3    |    Byte #4    |    Byte #5                   */
/*             ===============|===============|===============               */
/*             7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0               */
/*             `-------' `---------' `---------' `-----------'               */
/*               Hour      Minute      Second    1/100 Seconds               */
/*             (5 bits)   (6 bits)    (6 bits)     (7 bits)                  */
/*                                                                           */
/*****************************************************************************/

typedef struct      /* user AC flags */
{
    bit rlogon : 1;         /* L - Restricted to one call a day */
    bit rchat : 1;          /* C - Can't page the SysOp */
    bit rvalidate : 1;      /* V - Posts marked unvalidated */
    bit ramsg : 1;          /* A - Can't change the AutoMessage */
    bit rpostan : 1;        /* * - Can't post anonymously */
    bit rpostpvt : 1;       /* E - Can't post private */
    bit rpostnet : 1;       /* N - Can't post NetMail */
    bit rpost : 1;          /* P - Can't post at all */
    bit rvoting : 1;        /* K - Can't vote */
    bit rmsg : 1;           /* M - Force mail deletion */
    bit rreserved : 1;      /* RESERVED */
    bit onekey : 1;         /* onekey input mode */
    bit avatar : 1;         /* user has AVATAR */
    bit pause : 1;          /* pause */
    bit novice : 1;         /* user is at novice help level */
    bit ansi : 1;           /* user has ANSI */
    bit color : 1;          /* user has color */
    bit alert : 1;          /* alert SysOp when user logs on */
    bit smw : 1;            /* short-message waiting for user */
    bit nomail : 1;         /* user mail-box is closed */
    bit fnodlratio : 1;     /* 1 - No UL/DL ratio */
    bit fnopostratio : 1;   /* 2 - No post/call ratio */
    bit fnofilepts : 1;     /* 3 - No file points checking */
    bit fnodeletion : 1;    /* 4 - Protection from deletion */
}
uflags;

/*---------------------------------------------------------------------------*/

typedef struct      /* *.MIX status flags */
{
    bit deleted : 1;        /* is message deleted? */
    bit unvalidated : 1;    /* is message unvalidated? */
    bit permanent : 1;      /* is message permanent? */
}
msgindexstatr;

typedef struct      /* *.MIX Fido message attributes */
{
    bit private : 1;        /* private */
    bit crash : 1;          /* crash mail */
    bit received : 1;       /* received */
    bit sent : 1;           /* sent */
    bit fattach : 1;        /* file attached */
    bit intransit : 1;      /* in-transit */
    bit orphan : 1;         /* orphaned */
    bit kill : 1;           /* kill after sending */
    bit local : 1;          /* local message */
    bit hold : 1;           /* hold for pickup */
    bit unused : 1;         /* **UNUSED** */
    bit freq : 1;           /* file request */
    bit rreq : 1;           /* return receipt request */
    bit receipt : 1;        /* return receipt message */
    bit areq : 1;           /* audit request */
    bit fureq : 1;          /* file update request */
}
fidoattrib;

typedef struct      /* *.MIX Fido message attributes (extended) */
{
    bit direct : 1;         /* direct to recipient */
    bit immediate : 1;      /* immediate delivery */
    bit delsent : 1;        /* delete when sent */
}
fidoxattrib;

typedef struct      /* *.MIX : Message index records */
{
    longint hdrptr;             /* message header pointer */
    integer isreplyto;          /* reply-to message number (-1=none) */
    cpackdatetime isreplytoid;  /* packed date/time of replied message */
    integer numreplies;         /* number of replies to THIS message */
    cpackdatetime msgdate;      /* message date/time (packed) */
    byte msgdowk;               /* message day of week (0=Sun..6=Sat) */
    fidoattrib attrib;          /* Fido msg attributes (see above) */
    fidoxattrib xattrib;        /* extended Fido attribs (see above) */
    msgindexstatr flags;        /* status flags (see above) */
}
msgindexrec;

typedef struct      /* *.BRD from/to information */
{
    byte anon;          /* anonymous type (0=no, 1/2=yes, 3="Abby", */
                        /*   4="Problemed Person", 5=any name */
    word usernum;       /* user number (0=none) */
    word zone;          /* zone (0=none) */
    word net;           /* net (0=none) */
    word node;          /* node (0=none) */
    word point;         /* point (0=none) */
    string name[37];    /* user name (all caps) if anon=3..5, */
                        /* otherwise null ('')                */
    string real[37];    /* user real name (all caps) */
    string alias[37];   /* user alias (all caps) */
}
fromtoinfo;

typedef struct      /* *.BRD : Message header records */
{
    longint msgptr;         /* pointer to message text */
    word msglength;         /* length of message text */
    word cost;              /* cost to send message (NetMail only) */
    fromtoinfo fromi;       /* from user information */
    fromtoinfo toi;         /* to user information */
    string title[72];       /* title of message */
    string datetime[20];    /* Net/Echo/Group original msg date */
}
mheaderrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* *.DIR status flags */
{
    bit notval : 1;         /* if file is not validated */
    bit isrequest : 1;      /* if file is offline */
    bit resumelater : 1;    /* if file is resume-later */
}
filstat;

typedef struct      /* *.DIR : File records */
{
    string filename[13];    /* filename */
    string description[61]; /* file description */
    integer filepoints;     /* file points */
    integer nacc;           /* number DLs */
    byte res1;              /* RESERVED */
    integer blocks;         /* # 128 byte blks */
    integer owner;          /* ULer of file */
    string stowner[37];     /* ULer's name */
    string date[9];         /* date ULed */
    integer daten;          /* numeric date ULed       */
                            /* (# days since 01/01/85) */
    longint vpointer;       /* pointer to verbose descr (-1=none) */
    filstat filestat;       /* file status */
    byte res2[10];          /* RESERVED */
}
ulfrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* *.MNU status flags */
{
    bit clrscrbefore : 1;   /* C: clear screen before menu display */
    bit dontcenter : 1;     /* D: don't center the menu titles! */
    bit nomenuprompt : 1;   /* N: no menu prompt whatsoever? */
    bit forcepause : 1;     /* P: force a pause before menu display? */
    bit autotime : 1;       /* T: is time displayed automatically? */
}
mnuflags;

typedef struct      /* *.MNU : Menu records */
{
    string menuname[3][101];    /* menu name */
    string directive[13];       /* help file displayed */
    string tutorial[13];        /* tutorial help file */
    string menuprompt[121];     /* menu prompt */
    acstring acs;               /* access requirements */
    string password[16];        /* password required */
    string fallback[9];         /* fallback menu */
    byte forcehelplevel;        /* forced help level for menu */
    byte gencols;               /* generic menus: # of columns */
    byte gcol[3];               /* generic menus: colors */
    mnuflags menuflags;         /* menu status variables */
}
menurec;

typedef struct      /* *.MNU command status flags */
{
    bit hidden : 1;     /* H: is command ALWAYS hidden? */
    bit unhidden : 1;   /* U: is command ALWAYS visible? */
}
cmdflags;

typedef struct      /* *.MNU : Command records */
{
    string ldesc[71];           /* long command description */
    string sdesc[36];           /* short command description */
    string ckeys[15];           /* command-execution keys */
    acstring acs;               /* access requirements */
    string cmdkeys[3];          /* command keys: type of command */
    string mstring[51];         /* MString: command data */
    cmdflags commandflags;      /* command status variables */
}
commandrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* ZLOG.DAT : System log */
{
    string date[9];         /* entry date */
    integer userbaud[5];    /* new user logon BPS rates   */
                            /* (300,1200,2400,4800,9600+) */
    integer active;         /* % activity */
    integer calls;          /* # of calls */
    integer newusers;       /* # of new users */
    integer pubpost;        /* # of public posts */
    integer privpost;       /* # of private posts */
    integer netpost;        /* # of NetMail posts */
    integer criterr;        /* # of critical errors */
    integer uploads;        /* # of uploads */
    integer downloads;      /* # of downloads */
    longint uk;             /* amount ULed in K */
    longint dk;             /* amount DLed in K */
}
zlogrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* BOARDS.DAT status flags */
{
    bit mbrealname : 1;     /* real names are forced */
    bit mbvisible : 1;      /* visible to users w/o access */
    bit mbfilter : 1;       /* filter ANSI/8-bit ASCII */
    bit mbstrip : 1;        /* strip center/title codes */
    bit mbaddtear : 1;      /* add tear/origin lines */
    bit mbtopstar : 1;      /* Top Star base (GroupMail only) */
    bit mbimmune : 1;       /* immune to "twitting" */
    bit mbinternet : 1;     /* special Internet (UUCP) handling */
}
mbflags;

typedef struct      /* BOARDS.DAT : Message base records */
{
    string name[41];        /* message base description */
    string filename[9];     /* BRD/MIX data filename */
    string msgpath[41];     /* messages pathname */
    string password[21];    /* base password */
    acstring acs;           /* access requirement */
    acstring postacs;       /* post access requirement */
    word maxmsgs;           /* max message count */
    byte anonymous;         /* anonymous type */
    mbflags mbstat;         /* message base status vars */
    byte mbtype;            /* message base type */
    byte mbpost;            /* message base posting type */
    string origin[51];      /* origin line */
    byte kludge_color;      /* color of kludge line */
    byte quote_color;       /* color of quoted line */
    byte tear_color;        /* color of tear line */
    byte origin_color;      /* color of origin line */
    word zone;              /* network address */
    word net;               /* (zone:net/node.point) */
    word node;
    word point;
}
boardrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* CONFRENC.DAT : Conference data */
{
    struct
    {
        acstring acs;       /* access requirement */
        string name[41];    /* name of conference */
    }
    conference[27];
}
confrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* EVENTS.DAT : Scheduled event records */
{
    boolean active;             /* whether active */
    string description[31];     /* event description (for logs) */
    string etype;               /* A:CS, C:hat, D:os call, E:xternal */
    string execdata[21];        /* errorlevel if "E", commandline if "D" */
    integer busytime;           /* off-hook time before; 0 if none */
    integer exectime;           /* time of execution */
    boolean busyduring;         /* busy phone DURING event? */
    integer duration;           /* length of time event takes */
    byte execdays;              /* bitwise execution days,    */
                                /* or day of month if monthly */
    boolean monthly;            /* monthly event? */
}
eventrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* GFILES.DAT status flags */
{
    bit tbunhidden : 1;     /* whether *VISIBLE* to users w/o access */
    bit tbreserved1 : 1;    /* RESERVED FLAG #1 */
    bit tbreserved2 : 1;    /* RESERVED FLAG #2 */
}
tbflags;

typedef struct      /* GFILES.DAT : Text-file records */
{
    string title[41];   /* title */
    string filen[13];   /* filename */
    string gdate[9];    /* date of Tfile / Tfile base */
    integer gdaten;     /* numeric date for fast calculation */
    acstring acs;       /* access requirement */
    acstring ulacs;     /* upload to base access requirement */
    tbflags tbstat;     /* text-file base status vars */
    byte res[10];       /* RESERVED */
}
tfilerec;

/*---------------------------------------------------------------------------*/

typedef struct      /* LASTON.DAT : Last few callers records */
{
    longint callernum;      /* system caller number */
    string name[37];        /* user name of caller */
    integer number;         /* user number of caller */
    string citystate[31];   /* city/state of caller */
}
lcallers;

/*---------------------------------------------------------------------------*/

typedef struct      /* MACROS.LST : Keyboard macro records */
{
    string macro[4][241];
}
macrorec;

/*---------------------------------------------------------------------------*/

typedef struct      /* MODEM.DAT status flags */
{
    bit lockedport : 1;     /* COM port locked at constant rate */
    bit xonxoff : 1;        /* XON/XOFF (software) flow control */
    bit ctsrts : 1;         /* CTS/RTS (hardware) flow control */
}
modemflags;

typedef struct      /* MODEM.DAT : Modem configuration */
{
    word waitbaud;              /* wait bps */
    byte comport;               /* COM port number */
    string init[81];            /* initialization string */
    string answer[41];          /* answer string */
    string hangup[41];          /* hangup string */
    string offhook[41];         /* phone off-hook string */
    integer nocallinittime;     /* reinit modem after x mins of inactivity */
    word lockedportbaud;        /* bps rate to use when COM port locked */
    modemflags flags;           /* status flags (see above) */
    byte nocarrier;             /* NO CARRIER result code */
    byte resultcode[2][8];      /* CONNECT result codes:                    */
                                /* 300,1200,2400,4800,7200,9600,12000,14400 */
}
modemrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* NAMES.LST : Sorted names listing */
{
    string name[37];    /* user name */
    integer number;     /* user number */
}
smalrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* NETWORK.DAT status flags */
{
    bit nstrip : 1;         /* strip message codes? */
    bit naddtear : 1;       /* add tear/origin lines to Net/Group? */
    bit nholduser : 1;      /* hold all non-SysOp NetMail? */
    bit nhold : 1;          /* default NetMail to "hold"? */
    bit ncrash : 1;         /* default NetMail to "crash"? */
    bit nkill : 1;          /* default NetMail to "kill/sent"? */
}
netflags;

typedef struct      /* NETWORK.DAT : Network information */
{
    word zone;              /* network address       */
    word net;               /* (zone:net/node.point) */
    word node;
    word point;
    string origin[51];      /* origin line */
    byte kludge_color;      /* color of kludge line */
    byte quote_color;       /* color of quoted text */
    byte tear_color;        /* color of tear line */
    byte origin_color;      /* color of origin line */
    netflags flags;         /* status flags */
    string netpath[41];     /* NetMail path */
    string echopath[41];    /* EchoMail path */
    string grouppath[41];   /* GroupMail path */
    string nodepath[41];    /* nodelist path */
}
networkrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* NODELIST.DAT status flags */
{
    bit hub : 1;        /* node is a net hub */
    bit host : 1;       /* node is a net host */
    bit region : 1;     /* node is region coord */
    bit zone : 1;       /* node is a zone coord */
    bit cm : 1;         /* runs continuous mail */
    bit ores1 : 1;      /* reserved for Opus */
    bit ores2 : 1;      /* reserved for Opus */
    bit ores3 : 1;      /* reserved for Opus */
    bit ores4 : 1;      /* reserved for Opus */
    bit ores5 : 1;      /* reserved for Opus */
    bit nores1 : 1;     /* reserved for non-Opus */
    bit nores2 : 1;     /* reserved for non-Opus */
    bit nores3 : 1;     /* reserved for non-Opus */
    bit nores4 : 1;     /* reserved for non-Opus */
    bit nores5 : 1;     /* reserved for non-Opus */
    bit nores6 : 1;     /* reserved for non-Opus */
}
nodeflags;

typedef struct      /* NODELIST.DAT modem type flags */
{
    bit hst : 1;    /* node uses a USRobotics HST modem */
    bit pep : 1;    /* node uses a Telebit PEP modem */
    bit v32 : 1;    /* node uses a V.32 modem */
    bit v32b : 1;   /* node uses a V.32bis modem */
    bit h96 : 1;    /* node uses a Hayes Express96 modem */
}
modemtypes;

typedef struct      /* NODELIST.DAT : Version 6 nodelist data */
{
    integer net;            /* net number */
    integer node;           /* node number */
    integer cost;           /* cost per minute to call */
    string name[34];        /* node name */
    string phone[40];       /* phone number */
    string city[30];        /* city and state */
    string password[8];     /* password */
    integer realcost;       /* phone company's charge */
    integer hubnode;        /* node # of this node's hub (0=none) */
    byte rate;              /* actual bps rate divided by 300 */
    modemtypes modem;       /* modem type codes */
    nodeflags flags;        /* set of flags */
    byte res[2];            /* RESERVED */
}
nodedatarec;

typedef struct      /* NODELIST.IDX : Version 6 nodelist index */
{
    integer node;       /* node number */
    integer net;        /* net number */
}
nodeindexrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* PROTOCOL.DAT status flags */
{
    bit xbactive : 1;           /* is protocol active? */
    bit xbisbatch : 1;          /* is batch definition? */
    bit xbisresume : 1;         /* is resume definition? */
    bit xbxferokcode : 1;       /* does result code = xfer OK? */
}
xbflags;

typedef struct      /* PROTOCOL.DAT : File transfer protocols */
{
    xbflags xbstat;         /* protocol flags */
    string ckeys[15];       /* command keys */
    string descr[41];       /* description */
    acstring acs;           /* access string */
    string templog[26];     /* temp. log file */
    string uloadlog[26];    /* permanent log files */
    string dloadlog[26];
    string ulcmd[79];       /* UL/DL command lines */
    string dlcmd[79];
    string ulcode[6][7];    /* UL/DL codes */
    string dlcode[6][7];
    string envcmd[61];      /* environment setup cmd (B) */
    string dlflist[26];     /* DL file lists (B) */
    integer maxchrs;        /* max chrs in cmdline */
    integer logpf;          /* pos in log file for data (B) */
    integer logps;
    byte res[15];           /* RESERVED */
}
protrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* SHORTMSG.DAT : One-line messages */
{
    string msg[161];    /* message */
    integer destin;     /* destination user # (-1=deleted) */
}
smr;

/*---------------------------------------------------------------------------*/

typedef struct      /* STATUS.DAT archive configuration records */
{
    boolean active;         /* whether this archive format is active */
    string ext[4];          /* 3-char file extension */
    string listline[26];    /* view archive cmdline ('' for internal) */
    string arcline[26];     /* compression cmdline */
    string unarcline[26];   /* de-compression cmdline */
    string testline[26];    /* integrity test cmdline ('' for *None*) */
    string cmtline[26];     /* comment cmdline ('' for *None*) */
    integer succlevel;      /* success ERRORLEVEL (-1=ignore results) */
}
filearcinforec;

typedef struct      /* STATUS.DAT : System configuration */
{
    string gfilepath[80];       /* GFILES path (data files) */
    string afilepath[80];       /* AFILES path (text files) */
    string menupath[80];        /* MENUS path (system menu files) */
    string trappath[80];        /* LOGS path (trap/chat/log files) */
    string msgpath[80];         /* MSGS path (msg base data files) */
    string tfilepath[80];       /* TFILES path (Tfiles base files) */
    string temppath[80];        /* TEMP path (temporary files) */

    string bbsname[81];         /* BBS name */
    string bbsphone[13];        /* BBS phone number */
    string sysopname[31];       /* SysOp's full name or alias */
    integer maxusers;           /* max number of users system can have */
    integer lowtime;            /* SysOp begin minute (in minutes) */
    integer hitime;             /* SysOp end time */
    integer dllowtime;          /* normal downloading hours */
    integer dlhitime;
    boolean shuttlelog;         /* is Shuttle Logon active? */
    boolean lock300;            /* lock out 300 baud? */
    string sysoppw[21];         /* SysOp PW */
    string newuserpw[21];       /* newuser PW (or NULL if none) */
    string shuttlepw[21];       /* Shuttle PW (if Shuttle active) */
    integer b300lowtime;        /* 300 baud calling hours */
    integer b300hitime;
    integer b300dllowtime;      /* 300 baud DL hours */
    integer b300dlhitime;
    boolean closedsystem;       /* DON'T allow new users? */
    boolean swapshell;          /* is swap shell function enabled? */
    integer eventwarningtime;   /* time before event warning */
    string tfiledate[9];        /* last date text-files were inserted */
    byte swapshelltype;         /* swap shell type (0=disk,1=EMS) */

    byte res1[23];              /* RESERVED SPACE #1 */

    acstring sop;               /* SysOp */
    acstring csop;              /* Co-SysOp */
    acstring msop;              /* Message SysOp */
    acstring fsop;              /* File SysOp */
    acstring spw;               /* SysOp PW at logon */
    acstring seepw;             /* see SysOp PWs remotely  */
    acstring normpubpost;       /* post public messages */
    acstring normprivpost;      /* post private messages */
    acstring anonpubread;       /* see who posted public anon */
    acstring anonprivread;      /* see who posted private anon */
    acstring anonpubpost;       /* post anon public messages */
    acstring anonprivpost;      /* post anon private messages */
    acstring seeunval;          /* see unvalidated files */
    acstring dlunval;           /* DL unvalidated files */
    acstring nodlratio;         /* no UL/DL ratio */
    acstring nopostratio;       /* no post/call ratio */
    acstring nofilepts;         /* no file points checking */
    acstring ulvalreq;          /* uploads require validation by SysOp */
    acstring normnetpost;       /* post NetMail messages */

    string fsecmd[41];          /* full screen editor command */

    byte res2[38];              /* RESERVED SPACE #2 */

    byte maxprivpost;           /* max private posts per call */
    byte maxnetpost;            /* max NetMail posts per call */
    byte maxpubpost;            /* max public posts per call */
    byte maxchat;               /* max chat-pages per call */

    byte res3[4];               /* RESERVED SPACE #3 */

    byte maxlogontries;         /* tries allowed for PW's at logon */
    byte bsdelay;               /* backspacing delay */
    byte sysopcolor;            /* SysOp color in chat mode */
    byte usercolor;             /* user color in chat mode */
    integer minspaceforpost;    /* minimum K drive space left to post */
    integer minspaceforupload;  /* minimum K drive space left to upload */
    byte backsysoplogs;         /* days to keep SYSOP##.LOG */
    byte wfcblanktime;          /* minutes after which to blank WFC menu */
    byte linelen;               /* default video line length */
    byte pagelen;               /* default video page length */

    byte res4[18];              /* RESERVED SPACE #4 */

    boolean specialfx;          /* WFC menu "special effects" */
    boolean logonlogoff;        /* enable LOGON.BAT & LOGOFF.BAT? */
    boolean allowalias;         /* allow alias's? (handles) */
    boolean phonepw;            /* use phone number password in logon? */
    boolean localsec;           /* is local security ON? */
    boolean localscreensec;     /* is local screen-security ON? */
    boolean globaltrap;         /* trap ALL USER'S activity? */
    boolean autochatopen;       /* does chat buffer auto-open? */
    boolean autominlogon;       /* Auto-Message in logon? */
    boolean bullinlogon;        /* bulletins in logon? */
    boolean lcallinlogon;       /* "Last Few Callers" list in logon? */
    boolean yourinfoinlogon;    /* "Your Info" in logon? */
    boolean multitask;          /* is BBS multitasking? */
    boolean offhooklocallogon;  /* take phone off-hook for local logons? */
    boolean forcevoting;        /* is manditory logon voting active? */
    boolean compressbases;      /* "compress" file/message base numbers? */
    boolean searchdup;          /* search for dup. filenames when UL? */
    byte slogtype;              /* SysOp log type: File/Printer/Both */
    boolean stripclog;          /* strip colors from SysOp log output? */
    integer newapp;             /* user# to send new user application to */
    integer guestuser;          /* user# of guest user account */
    integer timeoutbell;        /* minutes before time-out bell */
    integer timeout;            /* minutes before timeout (logoff) */
    boolean usewfclogo;         /* whether to use WFC menu logo */
    boolean useems;             /* attempt to use EMS for overlay */
    boolean usebios;            /* use ROM BIOS for local video output */
    boolean cgasnow;            /* suppress snow on CGA systems */

    byte res5[16];              /* RESERVED SPACE #5 */

    filearcinforec
        filearcinfo[MAXARCS];       /* archive specs */
    string filearccomment[3][81];   /* BBS comments for archives */

    boolean uldlratio;          /* are UL/DL ratios active? */
    boolean fileptratio;        /* is auto file-pt compensation active? */
    byte fileptcomp;            /* file point compensation ratio */
    byte fileptcompbasesize;    /* file point "base compensation size" */
    byte ulrefund;              /* percent time refund for ULs */
    byte tosysopdir;            /* "To SysOp" file base */
    boolean validateallfiles;   /* validate ALL FILES automatically? */
    string remdevice[11];       /* remote output device (GATEx,COMx,etc) */
    integer maxintemp;          /* max K allowed in TEMP\3\ */
    integer minresume;          /* min K to allow resume-later */
    byte maxdbatch;             /* max files in DL batch queue */
    byte maxubatch;             /* max files in UL batch queue */
    byte unlistfp;              /* # of file points for unlisted DLs */

    byte res6[21];              /* RESERVED SPACE #6 */

    longint newcredit;          /* newuser NetMail credit */
    longint autocredit;         /* auto-validation NetMail credit */
    byte newsl;                 /* newuser SL */
    byte newdsl;                /* newuser DSL */
    acrq newar;                 /* newuser AR */
    uflags newac;               /* newuser AC */
    integer newfp;              /* newuser file points */
    byte autosl;                /* auto-validation SL */
    byte autodsl;               /* auto-validation DSL */
    acrq autoar;                /* auto-validation AR */
    uflags autoac;              /* auto-validation AC */

    string allstartmenu[9];     /* logon menu to start ALL users on */

    byte res7[22];              /* RESERVED SPACE #7 */

    string batchfileext[4];     /* batch filename extension */
    string bulletprefix[9];     /* default bulletins filename prefix */

    byte res8[15];              /* RESERVED SPACE #8 */

    secrange timeallow;         /* time allowance */
    secrange callallow;         /* call allowance */
    secrange dlratio;           /* # ULs/# DLs ratios */
    secrange dlkratio;          /* DLk/ULk ratios */
    secrange postratio;         /* post/call ratios */

    string lastdate[9];         /* last system date */
    byte curwindow;             /* type of SysOp window currently in use */
    boolean istopwindow;        /* is SysOp window on top of screen? */
    longint callernum;          /* total number of callers */
    integer numusers;           /* number of users */
    zlogrec todayzlog;          /* TODAY's ZLOG record */
    integer postcredits;        /* file points/upload credit */
                                /* compensation for posts    */
    boolean rebootforevent;     /* reboot before events? */
    boolean watchdogdoor;       /* WatchDog active in doors? */
    boolean windowon;           /* is SysOp window on? */
    string swappath[80];        /* swap shell path */
    string arcpath[41];         /* archive utility path */
    string protpath[41];        /* protocol driver path */

    byte res9[35];              /* RESERVED SPACE #9 */

    word versionid;             /* version (eg 0x0270 = v2.7) */
}
systatrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* STRING.DAT : User-definable strings */
{
    string ansiq[81];           /* "Do you want ANSI? " string */
    string note[2][81];         /* Logon notes (L #1-2) */
    string lprompt[81];         /* Logon prompt (L #3) */
    string echoc;               /* Echo char for PWs */
    string sysopin[81];         /* "SysOp In" (inside SysOp hours)*/
    string sysopout[81];        /* "SysOp Out" */
    string engage[81];          /* "Engage Chat" */
    string endchat[81];         /* "End Chat" */
    string wait[81];            /* "SysOp Working" */
    string pause[81];           /* "Pause" */
    string entermsg1[81];       /* "Enter Message" line #1 */
    string entermsg2[81];       /* "Enter Message" line #2 */
    string newscan1[81];        /* "NewScan begin" */
    string newscan2[81];        /* "NewScan done" */
    string scanmessage[81];     /* Message scanning prompt */
    string automsgt[81];        /* Auto-Message title */
    string autom;               /* Auto-Message border characters */

    string shelldos1[81];       /* " >> SysOp shelling to DOS ..." */
    string shelldos2[81];       /* " ... thank you for waiting." */
    string chatcall1[81];       /* "Paging SysOp, please wait..." */
    string chatcall2[81];       /* ">>><*><<<" */
    string guestline[81];       /* "To be a guest ... " */
    string namenotfound[81];    /* "Name NOT found in user list." */
    string bulletinline[81];    /* Bulletin line */
    string thanxvote[81];       /* "Thanks for voting" */

    string listline[81];        /* "List files - P to pause" */
    string newline[81];         /* "Search for new files -" */
    string searchline[81];      /* "Search all dirs for file mask" */
    string findline1[81];       /* "Search for descriptions... " */
    string findline2[81];       /* "Enter the string to search for.." */
    string downloadline[81];    /* "Download - " */
    string uploadline[81];      /* "Upload - " */
    string viewline[81];        /* "View interior files - " */
    string nofilepts[81];       /* "Insufficient file points." */
    string unbalance[81];       /* "Your UL/DL ratio is unbalanced" */

    string pninfo[81];          /* "P to Pause, N for next dir" */
    string gfnline1[81];        /* "[Enter]=All files" */
    string gfnline2[81];        /* "File mask: " */
    string batchadd[81];        /* "File added to batch queue." */

    string quotestr1[51];       /* message quote header #1 */
    string quotestr2[51];       /* message quote header #2 */

    string mtaskline[81];       /* "System Under Multi-Tasking..." */
}
fstringrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* UPLOADS.DAT status flags */
{
    bit fbnoratio : 1;          /* if <No Ratio> active */
    bit fbunhidden : 1;         /* whether *VISIBLE* to users w/o access */
    bit fbdirdlpath : 1;        /* if *.DIR file stored in DLPATH */
    bit fbreserved1 : 1;        /* RESERVED FLAG #1 */
    bit fbusegifspecs : 1;      /* whether to use GifSpecs */
    bit fbreserved2 : 1;        /* RESERVED FLAG #2 */
}
fbflags;

typedef struct      /* UPLOADS.DAT : File base records */
{
    string name[41];        /* area description */
    string filename[13];    /* filename + ".DIR" */
    string dlpath[41];      /* download path */
    string ulpath[41];      /* upload path */
    integer maxfiles;       /* max files allowed (1-2000) */
    string password[21];    /* password required */
    byte arctype;           /* wanted archive type (1..max,0=inactive) */
    byte cmttype;           /* wanted comment type (1..3,0=inactive) */
    byte res1[2];           /* RESERVED SPACE #1 */
    fbflags fbstat;         /* file base status vars */
    acstring acs;           /* access requirements */
    acstring ulacs;         /* upload requirements */
    acstring nameacs;       /* see-names requirements */
    byte res2[10];          /* RESERVED SPACE #2 */
}
ulrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* USER.LST status flags */
{
    bit lockedout : 1;          /* if locked out */
    bit udeleted : 1;           /* if deleted */
    bit trapactivity : 1;       /* if trapping users activity */
    bit trapseperate : 1;       /* if trap to seperate TRAP file */
    bit chatauto : 1;           /* if auto chat trapping */
    bit chatseperate : 1;       /* if seperate chat file to trap to */
    bit slogseperate : 1;       /* if seperate SysOp log */
    bit clsmsg : 1;             /* if clear-screen before message */
    bit avadjust : 1;           /* if AVATAR color adjust */
}
userflags;

typedef struct      /* USER.LST : User account records */
{

    /* configuration information */

    string name[37];            /* user name */
    string realname[37];        /* real name */
    string street[31];          /* mailing address */
    string citystate[31];       /* city, state */
    string zipcode[11];         /* zipcode */
    string ph[13];              /* user phone # */
    string bday[9];             /* user birthdate */
    string sex;                 /* user sex */

    string pw[21];              /* user password */
    string firston[9];          /* firston date */
    string laston[9];           /* laston date */

    string computer[31];        /* type of computer */
    string occupation[41];      /* occupation */
    string wherebbs[41];        /* BBS reference */
    string note[40];            /* SysOp note */

    string lockedfile[9];       /* lockout msg to print */
    clrs cols;                  /* user colors */
    byte linelen;               /* line length (# cols) */
    byte pagelen;               /* page length (# rows) */
    longint mpointer;           /* pointer to entry in MACRO.LST */
    string userstartmenu[9];    /* menu to start user out on */

    userflags flags;            /* flags (see above) */

    /* system access information */

    byte sl;                    /* SL */
    byte dsl;                   /* DSL */
    uflags ac;                  /* user flags */
    acrq ar;                    /* AR flags */

    /* message system information */

    byte lastmsg;               /* last message base # */
    integer pubpost;            /* # public posts */
    integer privpost;           /* # private posts */
    integer netpost;            /* # NetMail posts */
    integer forusr;             /* forward mail to user # */
    longint credit;             /* NetMail points (credit) */
    longint debit;              /* NetMail points (debit) */
    mhireadr mhiread;           /* NewScan high message pointers */
    mzscanr mzscan;             /* NewScan message bases */
    byte boardsysop[5];         /* msg board SysOp */

    /* file system information */

    byte lastfil;               /* last file base # */
    integer uploads;            /* # of ULs */
    integer downloads;          /* # of DLs */
    longint uk;                 /* amount ULed (kilobytes) */
    longint dk;                 /* amount DLed (kilobytes) */
    integer filepoints;         /* # of file points */
    byte flistopt;              /* type of file list type to use */
    fzscanr fzscan;             /* NewScan file bases */

    /* system usage information */

    longint ttimeon;            /* total mins spent on */
    integer loggedon;           /* # times logged on */
    integer tltoday;            /* # min left today */
    byte ontoday;               /* # times on today */
    byte illegal;               /* # illegal logon attempts */

    /* miscellaneous information */

    byte vote[20];              /* voting data */
    integer timebank;           /* # mins in Time Bank */
    integer timebankadd;        /* time added to timebank TODAY */
}
userrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* VERBOSE.DAT : Verbose descriptions */
{
    string descr[4][51];
}
verbrec;

/*---------------------------------------------------------------------------*/

typedef struct      /* VOTING.DAT : Voting records */
{
    string question[80];    /* voting question */
    integer numa;           /* number of user's who have answered */
    struct
    {
        string ans[41];     /* answer description */
        integer numres;     /* # user's who picked this answer */
    }
    answ[NUMVOTEAS];
}
vdatar;

#endif