This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-goldedplus/goldlib/gcfg/gs_wtr.h
2000-02-25 10:15:17 +00:00

537 lines
25 KiB
C++

// This may look like C code, but it is really -*- C++ -*-
// ------------------------------------------------------------------
// The Goldware Library
// Copyright (C) 1990-1999 Odinn Sorensen
// ------------------------------------------------------------------
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this program; if not, write to the Free
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
// MA 02111-1307, USA
// ------------------------------------------------------------------
// $Id$
// ------------------------------------------------------------------
// header file converted from Pascal to C by damWARE, 08.06.98.
// WaterGate Developers Kit for release 0.93
// database structures
// include this file from one of your source files with $I structs.pas
// this file describes the structures of WaterGate's database. There is
// no code in header, but just the declarations of the structures. There
// _is_ a whealth of explanation in this file though!
/* History:
950903 0.19 - Initial release.
950918 0.19.p2 - The config structure in the original release was a
complete mess and unusable.
951030 0.20 - Added administrator fields.
951203 0.21 - New list server user type, longer time zone string,
export AKA in user record.
960214 0.90 - Config: Log9->LogAreaFix and Log10->LogMapApply.
UUCPForwardRecord: reduced path length by 1 and
added Group letter.
960530 0.91 - AreaBase: Added fields for decoding files.
Config: Log11..Log14 are now used.
New fields for config: CopyHeaders_FU, MailGrade,
NewsGrade, TimeSlicing, NetmailDecode,
NetmailDecodePath, PrivateDecode, PrivateDecodPath.
961014 0.92 - Config: Log15 and Log16 are now used, Added RAR
support, more system node numbers, more copy header
entries, more areafix/newsfix forward entries,
remove unused fields.
ListServer: Added Access and DefaultAccess.
UserBase: Added BAG and SMTP variant record entry.
AreaBase: Seen-BY akas now support 100 bits.
960706 0.93 - New groups format and lots of other changes.
AreaBase 04->07: Changed IsInGroups, Added Hidden.
Updated groups explanation.
UserBase 05->08: Removed unused longint. Changed
groups, added envelope header.
ListServer 03->05: Added re-confirmation fields,
added MLAddress, added confirm interval.
Config 14->22: Changed Default_F and Default_U,
removed ConversionTable, Added SmtpForward,
MaxXPostNewsGroups, WildCatMSGLockDir, OpusDateFormat,
MaxWildCatMsgLen, KillAreafixMsgs, Color set.
*/
// I have reduced all the types and constants we use, to make it easier
// for you to read the structures. The names used end with _F if it is
// Fidonet related, and with _U if it is UUCP/Usenet related. _B is BAG,
// _S is SMTP and _P is POP3.
#if defined(GOLD_CANPACK)
#pragma pack(1)
#endif
/*
**==========================================================================
** ABOUT THE DATABASES
**==========================================================================
*/
// WaterGate uses six binary database files and one ascii configuration
// file. This source file only covers the six binary databases. Each of
// the database files starts of with a 26 byte long header, which is
// basically a string that is written to disk, including the length byte
// at the first position. The string is thus declared as a STRING[25].
// Each database has its own header, as defined below. The last two
// digits are a modification counter, which is increased by one very
// time the database structures change. You have to check this header
// and it has to match exactly, or else you should not access the
// databases with the structures in this file!
const char AreaBaseHeader[26] = "WtrGate AreaBase 07";
//const char UserBaseHeader[26] = "WtrGate UserBase 08";
//const char SubscrBaseHeader[26] = "WtrGate SubscrBase 01";
//const char GrpDescrBaseHeader[26] = "WtrGate GroupDescr 03";
//const char ListServerHeader[26] = "WtrGate ListServer 05";
const char ConfigHeader[26] = "WtrGate Config 22";
// Directly after this string, the first record starts. All record
// numbering is 1..n, with the special value 65535 meaning a NIL pointer
// record, mostly used to indicate free positions or the end of a list
// of record numbers.
const word NILRecordNr = 0xFFFF;
// to find out how many records are present in a database, you use the
// following formule:
//
// RecCount = ((FileSize (Database)-26) DIV SizeOf (Record));
//
// This formula can be used for each of the databases. Simply substitute
// "Record" with the correct structure name and "Database" with the
// actual file variable. It is best to declare the file variable as a
// FILE and to open the database with a Reset (Database,1), as below:
//
// VAR AreaFile : FILE;
// RecCount : WORD;
//
// BEGIN
// Assign (AreaFile,'AREABASE.TDB');
// Reset (AreaFile,1);
// BlockRead (AreaFile,Header,26);
// RecCount:=(FileSize (AreaFile)-26) DIV SizeOf (AreaBaseRecord));
// Close (AreaFile);
// END
//
// To read and write a record, you substract 1 from the record number,
// multiply it with the record size and add 26, then seek to that
// position in the file and read or write the record, like this:
//
// VAR AreaRec : AreaBaseRecord;
// AreaRecNr : WORD;
// Position : LONGINT;
//
// BEGIN
// Position:=26+(AreaRecNr-1)*SizeOf (AreaRecord);
// Seek (AreaFile,Position);
// BlockRead (AreaFile,AreaRec,SizeOf (AreaBaseRecord));
// END;
/*
**==========================================================================
** GLOBAL STRUCTURES
**==========================================================================
*/
// this structure is used to hold an AKA, whereever required
typedef struct {
word zone;
word net;
word node;
word point;
char domain[26];
} FidoAddrType;
/*
**==========================================================================
** GROUP DESCRIPTIONS DATABASE
**==========================================================================
*/
// this database contains 128 records, one for each of the groups. Each
// record hold the description of the group, the system AKA to use,
// which is an index number from 1 to 100 in the array of system AKAs
// in the Configuration Record. And finally it contains the ReadOnly
// boolean, which is set to TRUE to disable posting to any area in this
// group, unless the user and the area are both in read/write group as
// well.
struct {
char groupdesc[31];
byte originaka; // 1..100
bool readonly;
} GroupDescRecord;
// [...]
// new groups storage (0.93):
//
// there are 128 groups, numbered 1 to 128. The AreaBase.IsInGroups
// and UserBase.Groups are 16 byte arrays, where each byte represents
// subscription to one group. Bit 0 in the first byte is group 1, etc.
const word MaxGroups = 128; // A1-5,B1-5,..,Y1-5,Z1-3
const word GroupFlagLen = MaxGroups / 8;
typedef byte GroupFlagType[GroupFlagLen]; // bit mask
// to access to groups, use the GroupFlagType and the following code
// sequence to access the group list.
//
// VAR I,O : BYTE;
//
// I:=1+((NewGroupNr-1) DIV 8);
// O:=(NewGroupNr-1) MOD 8;
// Group[I]:=Group[I] OR (1 SHL O);
//
// The above example adds NewGroupNr (1..128) by settings the correct
// bit in the array. I is an index into the array and O is the bit
// number ("offset", 0..7).
//
// You can use constructions with AND to reset a bit. I have created
// abstract functions to access a GroupFlagType for resetting it,
// adding a single group, removing a single group, testing for
// membership, set overlap tests, etc.
/*
**==========================================================================
** AREABASE
**==========================================================================
*/
typedef struct {
bool deleted;
byte areatype; // 0=Echo, 1=Netmail, 2=Local, 3=Email
char areaname_U[61]; // the two names of this area
char areaname_F[61];
char comment[61]; // the comment / description
byte isingroups[16]; // the groups this area is in. See the group
// descriptions database for an explanation.
word userlist; // points to the first subscription base
// record. See explanation there.
byte originaka; // the system AKA to use for the origin line,
// is an index 1..20 into the array in the
// configuration record.
byte addseenbyakas[13]; // The system AKAs 1..100 to add to the SEEN-BY
// If the bit is set, it is added. [0]bit0 is
// AKA 1, [0]bit1 2, etc.
bool passive; // TRUE if this area is passive
bool alwpassive; // TRUE if this area is allowed to be passive
byte originnr; // origin number to use: 0=custon, 1/2=system
char origin[62]; // the custom origin line
byte fidomsgstyle; // the style of this area's message base
// 0=None, 1=Msg, 2=Squish, 3=Jam, 4=WildCat
char fidomsgpath[80]; // the path to the database
word fidomsgage; // the maximum age of a message, when cleaning
word fidomsglimit; // the max. num of msgs in allowed
byte moderated; // is this area moderated? 0=No, 1=Usenet
char moderator[51]; // the e-mail address of the moderator
bool decode; // XX/UU/MIME decode?
char decodepath[80]; // path where to store decoded files
bool hidden; // if TRUE then doesn't show up in AreaFix/newsfix
} AreaBaseRecord;
/*
**==========================================================================
** USERBASE
**==========================================================================
*/
// the userbase holds all the users that are configured in WtrConf. There
// is one record for each user. The maximum number of records is 65534.
struct {
bool deleted; // TRUE means deleted
byte system; // 0=Fido, 1=Usenet, 2=Bag supplier
char organization[61]; // description of this user
byte groups[16]; // the groups this user is allowed in
// see the group description database
// for an explanation of the storage.
bool passive; // is this user passive?
char areafixpwd[21]; // its AreaFix/newsfix password
bool allowfrom; // TRUE = allow special AreaFix commands
bool allowcreate; // TRUE = allow new area creation
bool allowsubdomains; // TRUE if this user is allowed to have sub-domains
word arealist; // pointer to the first subscription base
// record, holding the areas this user is
// subscribed to. See the subscription
// base for an explanation.
char uucpname[11]; // the user's UUCP name
bool worldreg; // World Registered UUCP name?
char domains[51][6]; // domain names
word type;
union {
// 0 = FidoNet style user
struct {
FidoAddrType Address; // AKA
char sysop[51]; // full name of the sysop
char packetpwd[9]; // password for *.PKT files
byte compression;
dword maxpktlength; // max length of an .PKT files
// before it is cut off and packed
byte sendformat; // the send condition: 0=Normal,
// 1=Hold, 2=Crash, 3=Direct.
byte lastarchdow; // day-of-week used on the last sent
// archive. 0=first, 1..7 = dow.
byte lastarchnr; // last archive number used
byte exportaka; // Export AKA. 0=Auto, 1..100=System AKA
bool decodefiles; // TRUE = decode files for this user?
} fidostyle;
// 1 = UUCP style user
struct {
byte compress; // 0=None, 1=Compress, 2=Zip
bool cunbatch; // TRUE= add CunBatch to compressed archive
char mailgrade;
char newsgrade;
bool gigot; // TRUE = create GIGOT compatible .XQT files
} uucpstyle;
// 2 = BAG style user
struct {
char bagbacklink[11]; // uucp name of the bag return system
char bagpath[80]; // Search path for the bag files
} bagstyle;
// 3 = SMTP mailer link
struct {
char smtpinpath[80]; // where to process .WRK/.TXT files from
char smtpoutpath[80]; // where to create .WRK/.TXT files
} smtpstyle;
// 4 = POP3 mailbox link
struct {
char pop3file[80]; // where is the POP3 file stored? }
char recipient[51]; // single recipient address
char separator[16]; // separator searched for
char envelopehdr[26]; // envelope header searched for
} pop3style;
// 5 = BBS
struct {
char inbound[80]; // search for .PKT files from BBS tosser here
char outbound[80]; // create .PKT files for BBS tosser here
byte systemaka; // 1..100
word fakezone; // fake AKA
word fakenet;
word fakenode;
char inboundext[3]; // extension for inbound packets (PKT/OUT)
bool keepsbp; // TRUE = keep SEEN-BY and PATH?
byte reserved1; // unused
} bbsstyle;
};
} UserBaseRecord;
/*
**==========================================================================
** SUBSCRIPTIONS DATABASE
**==========================================================================
*/
// [...]
/*
**==========================================================================
** CONFIGURATION DATABASE
**==========================================================================
*/
// structures for the system configuration database. There is only one
// record in this database. The structures below start with the areafix
// and newsfix forwarding records, which are used in the configuration
// record. I have removed all other references and put them straigt in.
// Since AreaFix and newsfix forwarding have not been re-implemented
// yet, I have not described the structures, until they become certain.
typedef struct {
FidoAddrType uplinkaddress; // uplink AKA
bool unconditional; // allow all new names, or check against file?
char arealistpath[51]; // path to the forwarding file
byte arealist; // type of the file. 0=areas.bbs, 1=names list
char areamanager[11]; // name of uplink's AreaFix
char password[11]; // password for uplink's areafix
byte group; // group to put new areas in. 0 = Group A1
bool addplus; // Add "+" to connect in front of areaname
} AreafixForwardRecord;
typedef struct {
char uucpname[11]; // UUCPname of uplink
char arealistpath[50]; // path to the newsgroups listing
byte group; // group to put new areas in. 0 = Group A1
} UUCPForwardRecord;
typedef struct {
char systemdir[80]; // path to the other databases
char sysop[51]; // full name of the sysop
word dupechecks; // max. number of dupes to remember (16000 max.)
bool dodupechk; // TRUE = Check for dupes
byte maxhandles; // max. number of outbound files to keep open
bool cachetdbs; // TRUE cache the databases in XMS
char toolargepath[80]; // path to the too-large directory for oversized msgs
char logfilepath[80]; // path and filename of the logfile and stats file
FidoAddrType nodenrs[100]; // system AKAs
word pointnets[100]; // pointnet for each of the system AKAs
byte security_F[2]; // Secure the inbound paths: 0=Yes, 1=No
char inbound_F[80][2]; // paths to the inbound directories
char outbound_F[80]; // path to the outbound directory
char comprprgs_F[80][18]; // Fido compress/decompression programs
dword maxfidomsglen;
dword maxfidoarclen;
byte defgroups_F[16]; // default groups for a new Fido user
byte fidosystem; // 0=Binkley, 1=Frontdoor, 2=dBridge
bool fidoacceptto; // scan the To: field for a e-mail address?
byte fidonetmailtype; // Netmail msgbase type: 0=None, 1=Msg, 2=Squish, 3=Jam
char fidonetmailpath[80]; // path to the database
byte fidobadareatype; // Bad msgbase type: 0=None, 1=Msg, 2=Squish, 3=Jam
char fidobadpath[80]; // path to the database
byte fidodupeareatype; // Dupe msgbase type: 0=None, 1=Msg, 2=Squish, 3=Jam
char fidodupepath[80]; // path to the database
byte fidoautocreatetype; // New created areas type: 0=None, 1=Msg, 2=Squish, 3=Jam
char defaultfidomsgpath[80];// default path to use (no filename)
bool stripseenby; // TRUE = strip seen-bys when importing
bool autolink; // TRUE = link after import
bool replacetear; // replace the tearline when exporting?
word defnumbtokeep_F; // default number of msgs to keep for an new area
word defdaystokeep_F; // default number of days to keep msgs for a new area
byte fidoarcmailextension; // 0=Arc(0..9), 1=Hex(0..9,A..F), 2=All(0..9,A..Z)
byte uucpgateway; // Gateway AKA nr: 1..10, as index in system AKAs array
char nameseparator; // character to replace spaces with in user names
// when building an e-mail address.
char origins[2][62]; // the two system origin lines
bool worldwide; // TRUE = system UUCPname is world-reg
byte defgroups_U[16]; // default groups to use for UUCP
char spoolbasedir[80]; // path to the spool directories
dword maxdatlength; // Max. length of .DAT files, before compression
char smarthost[11]; // UUCPname of your smarthost
char uucpname[11]; // system UUCP name
char backbone[51]; // domain name of the backbone
char organization[60]; // system organization line
char domains[6][51]; // system domain names
char comprprg_U[4][80]; // installed compression/decompression programs
byte privmailtype; // type of private mail message base:
// 0=None, 1=*.MSG, 2=Squish, 3=JAM
char privmailpath[80]; // path to the message base
char privmailoption[10][73];
byte privmailselect[10]; // where to search: 0=From, 1=To, 2=Subj
byte reserved1;
AreafixForwardRecord areafixforward[50];
UUCPForwardRecord uucpforward[50];
dword maxsquishmsglen; // max msg length when importing into Squish base
dword maxjammsglen; // max msg length when importing into JAM base
byte defaultcompressor; // default compression to set in new user records:
// 0=ARC, 1=ARJ, 2=LZH, 3=PAK, 4=ZIP, 5=ZOO, 6=RAR
// 7=OP1, 8=GUS, 9=PKT.
bool packedaddresses; // TRUE = build small e-mail addresses
char rescanflagfile[80]; // path to the rescan flag file
char dbridgequeuepath[80]; // path to the d'Bridge dir where to store the queueing files }
char areafixname[11]; // name of the fido areafix
bool killgatednetmail; // TRUE = automatically kill gated netmail
char newsfixname[11]; // name of the UUCP areafix (newsfix)
bool useswapfile; // TRUE = use swapfile
char swapfilepath[80]; // path to the swapfile
byte swapfilesize; // max length of the swapfile in megabytes
bool replyfsc35; // TRUE = create FSC35 reply kludges
bool headerfullname; // TRUE put the full name in the From: field?
bool logdebug; // TRUE = enable all other options
bool logspooltossed; // TRUE = log tossed spool files
bool logfidoextract; // TRUE = log extracted fidonet archives
bool logfidotossed; // TRUE = log tossed fido .PKT files
bool logtranslationFU; // TRUE = log built e-mail addressed
bool logcheckfilter; // TRUE = log accepted / denied new newsgroup names
bool logxfix; // TRUE = log fixed to-address from .X files
bool logcopyheaders; // TRUE = Log headers that were copied from fido netmail/echomail messages
bool logillegalheaders; // TRUE = Log found headers that are not allowed
bool logareafix; // TRUE = Log commands to / replyies from areafix / newsfix
bool logmapapply; // TRUE = Log applied mapping statements
bool lognetmailimport; // TRUE = log all imported netmails
bool logrodeny; // TRUE = log all read-only denied postings in areas
bool logpkteachecho; // TRUE = log each echomail plus length
bool loguucpoutbound; // TRUE = log all created UUCP files
bool logsmtpoutbound; // TRUE = log all created SMTP jobs
bool logexportednetmail; // TRUE =
bool log17, log18, log19, log20, log21;
char copyheadernames[16][30];// names of the e-mail Headers to search for
// without the trailing space!
byte copyheaderhow[30]; // How to store the copied header:
// 0=Not, 1=Kludge, 2=Text
char gatewayuser[37]; // user name of the gateway user
bool bounceunknown; // TRUE=bounce undeliverable mail
// FALSE=Write to netmail
bool bouncesmall; // TRUE=Send only the first approximate 20 lines
byte adminaddrtype; // 0=None, 1=Fido, 2=Usenet
char adminfidoname[37]; // Full name of the administrator, for the Fidonet address
FidoAddrType adminfidoaddr; // Fidonet address of the administrator
char adminuucpaddr[256]; // E-mail address of the administrator
bool adminsendlog; // Send the logfile to the administrator?
bool adminsend2, adminsend3, adminsend4, adminsend5, adminsend6, adminsend7,
adminsend8, adminsend9, adminsend10,adminsend11, adminsend12, adminsend13,
adminsend14,adminsend15,adminsend16;
char timezone[26]; // time zone description
bool copyheaders_FU; // TRUE = Scan and copy headers Fido->Usenet
char mailgrade; // grade letter to use in mail job UUCP filenames
char newsgrade; // grade letter to use in news batch job UUCP filenames
bool timeslicing; // FALSE = Do not detect multitasker
bool netmaildecode; // TRUE = scan and decode files from imported netmail
char netmaildecodepath[80]; // where to store the files
bool privatedecode; // TRUE = scan and decode files from imported private scanned messages
char privatedecodepath[80]; // where to store the files
word maxrmaillinelen; // max len for rmail line in .X file
byte minimumdiskfree; // min MB's free for disk check
char diskfreedrives[27]; // drives to check for disk check
byte old;
byte rmailcorrect; // rmail correction to use
bool gatemsgid; // TRUE = gate Message-ID -> MSGID
bool forcenobitmask; // TRUE = don't put "0" in front of UUCP jobs
char rescanflagfile2[80]; // editor rescan flag file
byte organizationinorigin; // Gate organization -> origin: no, yes, override
bool alwaysmimequoteprint; // TRUE = always use quoted-printable
char smtpforward[51]; // address for dumping mail at ISP
byte maxxpostnewsgroups; // cross-post limit. 255 = allow all
char wildcatmsglockdir[80]; // path to MSGLOCK directory for WildCat conference lock
bool opusdateformat; // TRUE = create *.MSG with Opus date fields
dword maxwildcatmsglen; // max len of a single WildCat message
bool killareafixmsgs; // kill *.MSG with areafix after processing?
byte colors[21]; // color codes for each of the elements
} ConfigRecord;
#if defined(GOLD_CANPACK)
#pragma pack()
#endif
//==== END OF FILE ==========================================================