WARNING: This document is subject to change at any time. Any changes made will be indicated by a vertical bar (|) in column 1 of the file. | Last update: 04/05/94 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= PCBoard v15.0 now uses two separate files for conference information. They are CNAMES.@@@ and CNAMES.ADD. Both of which are random access (fixed length records). A discussion of each follows: CNAMES.@@@ FILE LAYOUT ---------------------- The CNAMES.@@@ files is a random access file with 2 byte (INTEGER) at the start of the file that indicates the LENGTH of the conference record structure. The actual file layout is as follows: typedef struct { char Name[14]; conference name bool PublicConf; new user default registration bool AutoRejoin; auto-rejoin for this conference bool ViewMembers; allow viewing conference members bool PrivUplds; make uploads private bool PrivMsgs; make all messages private bool EchoMail; is this an Echo-Mail conference int ReqSecLevel; security required to join non-public conf. int AddSec; additional security level added after join int AddTime; additional time added after join char MsgBlocks; number of message base index blocks char MsgFile[32]; name and location of messages file char UserMenu[32]; name and location of Users Menu char SysopMenu[32]; name and location of Sysops Menu char NewsFile[32]; name and location of Conference News char PubUpldSort; sort type for public upload DIR file char UpldDir[29]; name and location of public upload DIR file char PubUpldLoc[26]; public upload location char PrvUpldSort; sort type for public upload DIR file char PrivDir[29]; name and location of private upload DIR file char PrvUpldLoc[26]; private upload location char DrsMenu[29]; name and location of conference doors menu char DrsFile[33]; name and location of DOORS.LST file char BltMenu[29]; name and location of conference blt menu char BltNameLoc[33]; name and location of BLT.LST file char ScrMenu[29]; name and location of conference scripts menu char ScrNameLoc[33]; name and location of SCRIPT.LST char DirMenu[29]; name and location of directories menu char DirNameLoc[33]; name and location of DIR.LST file char PthNameLoc[33]; name and location of DLPATH.LST file } pcbconftype; Accessing the file then is a simple matter of determine which record number you want and multiplying it by the size of the conference record and then adding the two byte offset for the header. In other words, you might do the following: read(cnames,&RecSize,sizeof(int)); lseek(cnames,(ConfNum-1)*RecSize+sizeof(int),SEEK_SET); read(cnames,&ConfRec,sizeof(pcbconftype)); Note that you first read in the two byte header to determine the actual record size on disk. You can do this ONCE at the startup of your code and record the value so that you never have to read it again. The record size MAY may be larger than the size of the structure that you want to read in since you may not want to use the entire structure or it may be updated in a later release of PCBoard code. So by using the two byte header as your record size you will remain compatible with updates to PCBoard. Also, notice that in the lseek() function call the size of the header was added to the equation so that you are positioned right where the record starts in the file. NOTE: The file layout for the CNAMES file does not contain any kind of limit as to the number of conferences which may be stored in the file. However, since PCBoard uses an unsigned integer for the conference number it limits the number to 65535. HOWEVER, because the "Main Board Area" counts as one AREA - the highest "numbered" conference on a system will be 65534 because one more than that would create 65536 conference AREAS which would not fit inside of an unsigned integer. CNAMES.ADD FILE LAYOUT ---------------------- The CNAMES.@@@ files is a random access file of 256 bytes per record with the first record starting at offset 0 (no header information). The actual file layout is as follows: #define ADDCONFRESERVE 64 typedef struct { bool ForceEcho; turn off echo question, force all msgs to echo bool ReadOnly; do not allow ANY msgs to be entered in conf bool NoPrivateMsgs; do not allow PRIVATE msgs to be entered char RetReceiptLevel; level required to request return receipts bool RecordOrigin; Record ORIGIN in messages bool PromptForRouting; Prompt user for ROUTING information bool AllowAliases; Allow aliases to be used bool ShowIntroOnRA; Show the Conf INTRO in the middle of R A scan char ReqLevelToEnter; Security Level required to enter messages char Password[13]; password reqd to join if private char Intro[32]; name/location of conference INTRO file char AttachLoc[32]; location for file attachment storage char RegFlags[4]; RXS flags for automatic conf registration char AttachLevel; Level required to attach a message char CarbonLimit; max number of names in carbon list char CmdLst[32]; name/location of CMD.LST use instead of default bool OldIndex; maintain old MSGS indexes? bool LongToNames; allow long TO: names to be entered char CarbonLevel; level required to enter @LIST@ messages char ConfType; one byte code for conference type (*see below) long ExportPtr; a pointer to the last message number exported float ChargeTime; amount to charge for time spent in conference float ChargeMsgRead; amount to charge for each message read float ChargeMsgWrite; amount to charge for each message written char Reserved[ADDCONFRESERVE]; reserved for future growth char Name2[48]; conf name #2 (**see below) } addconftype; Accessing the file then is a simple matter of determine which record number you want and multiplying it by the size of the conference record. In other words, you might do the following: lseek(file,(ConfNum-1)*sizeof(addconftype),SEEK_SET); read(file,&AddRec,sizeof(addconftype)); *NOTE: Conference types are defined as follows: ConfType = 0 = Normal PCBoard Conference ConfType = 1 = Internet Email (Import & Export) ConfType = 2 = Internet/Usenet Junk (Import Only) ConfType = 3 = Usenet Moderated Newsgroup (Import Normally / Export Public Messages as Email to Moderator / Export Private Messages as Email to TO:) ConfType = 4 = Usenet Public Newsgroup (Import Normally / Export Public Messages as Articles / Export Private Messages as Email to TO:) ConfType = 5 = Fido Conference **NOTE: The actual conference name is now composed of two parts. The first 13 bytes of the name are found in CNAMES.@@@, the last 47 bytes of the name are found in CNAMES.ADD at the end of the structure (skipping over the reserved bytes). Don't forget that the first part had a NULL terminator which needs to be removed as you concatenate the two strings together. CNAMES.IDX FILE LAYOUT ---------------------- | The CNAMES.IDX file is used by 1) PCBoard to speed up the (J)oin Command | when used with a conference name, and 2) by the UUCP import utility (UUIN) | to speed up the importing process. | | The file is composed of one record per conference, with the record format | looking like this: | | typedef struct { | char Name [ 60 + 1 ]; | unsigned Num; | } cnamesidxtype; | | The Name field is NUL terminated, and the Num field is the conference | number. The entire file is sorted by conference name (case insensitive).