// 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 ==========================================================