UltraBBS v2.08 File Formats 07/25/91 Message File Format ------------------- In the messages file (extension ".DAT"), each record is 150 bytes long. The first record in each messages file has the following format: struct firstrecord { long nextrecord; long highmsgnum; long lowmsgnum; long lastfidomsgimported; char reserved[134]; } The nextrecord variable contains the next record # that should be used in the messages file (first record in file is record # 0). The highmsgnum variable contains the current high message number in the message base, and lowmsgnum contains the current low message number in the message base. The lastfidomsgimported variable is used by the FIDOCVT program and is the number of the last message that was imported by FIDOCVT (or the last message that has already been exported to FIDO format). The header of each message in the messages file has the following format: struct msgrecord { long msgnum; unsigned char from[26]; unsigned char to[26]; unsigned char msgdate[9]; unsigned char msgtime[6]; unsigned char subject[26]; unsigned char msgpass[21]; unsigned char active; long referto; unsigned char datercvd[9]; unsigned char records; unsigned char private; unsigned char timercvd[6]; unsigned char echoflag; unsigned char rr; unsigned char perm; unsigned char attached; int hasreplies; unsigned char reserved[4]; } All character arrays ("strings") are NULL TERMINATED character arrays! They are NOT padded with spaces! This applies for the rest of this file, except where specifically stated otherwise. Whatever follows the null byte is of no consequence, it is ignored. The msgnum variable is the number of this message. The from variable is the name of the user who entered the message. The to variable is the name of the user to whom the message was entered. The msgdate variable is the date on which the message was entered ("MM/DD/YY" format). The msgtime variable is the time on which the message was entered ("HH:MM" format). The subject variable is the subject of the message. The msgpass variable is the password of the message, it should be null if there is no password on the message. The active variable is nonzero if the message is active, zero if the message is killed. The referto variable contains the message number of the message which this message is a reply off of, 0 if this message is not a reply to any other message. The datercvd variable contains the date on which this message was received ("MM/DD/YY" format), it should be a 0 length string if the message has not been received yet. The records variable contains the # of records in the message's text area (it does NOT include the header!). The private variable is nonzero if the message is receiver only, or zero if it is public or password protected. The timercvd variable contains the time on which this message was received ("HH:MM" format), it should be a 0 length string if the message has not been received yet. The echoflag variable is used only for conferences designated as 'echo' conferences. If nonzero, it is assumed that the message is supposed to be exported for echomail, if zero, it should stay only in the local message base. The rr variable is nonzero if the user has requested a return receipt, zero if he has not (a return receipt is generated when the message is first received, the rr flag is NOT changed). The perm variable is nonzero if the message cannot be killed by the receiver, zero if it can (this should only be used on public messages). The attached variable is nonzero if a file is attached to the message, zero if a file is not attached. The hasreplies variable is nonzero if the message has replies to it, otherwise it is set to zero. The reserved variable is used for future use and should be set to all nulls. If a file is attached, it will be placed in a subdirectory off of your attach directory named MSGNUMBER.CONF (for example, ATTACHDIR\1.0\filename.ext for message # 1 in conference # 0). The actual text records of the message (following each header) are strings of text, each representing a line of the message, followed by (Ctrl-A) characters. The very last (Ctrl-A) of the message (representing the (Enter) on the last line of the message) is followed by a (Ctrl-B) character. The rest of the current record is padded out by unpredictable characters to the next 150-byte boundary. The records in the messages index file (extension ".NDX") have the following format: struct messageindexrecord { long record; unsigned char to[26]; unsigned char from[26]; unsigned char private; unsigned char active; unsigned char subject[26]; } The index begins at the low message number specified in the first record of the message file. The long integer is the record # in the messages file of the message it represents (first record in file is record # 0 again). For example, if the low message number is 5, and you wanted to find message # 5 in the messages file, you would look at the first record in the index file to get message # 5's record in the messages file. The to, from, private, active, and subject fields should correspond to those fields in that message's actual header. Since the index file is based on the lowmsgnum variable, you will not want to change the lowmsgnum variable at any time unless your program does a complete pack of the message files. FileBase File Format -------------------- In the FileBase data file (extension ".DAT"), each record is 338 bytes long. Each file entry in the file has the following format: struct filerecord { unsigned char file[13]; unsigned long filesize; unsigned char uploadedby[26]; int timesdled; unsigned char filelocation[41]; unsigned char lastdl[9]; unsigned char dateoful[9]; int freefile; unsigned char id[5]; unsigned char descrip[225]; int deleteflag; } The file variable contains the actual file name of the file on the BBS. The filesize variable contains the size (in bytes) of the file on disk, or 0 if the file has a "variable" size. The uploadedby field contains the full name of the user who uploaded the file. The timesdled field contains the number of times that this file has been downloaded. The filelocation variable contains the actual physical location of the file (on the disk drive). The lastdl and dateoful fields contain (in "MM/DD/YY" format) the last date the file was downloaded, and the date that the file was uploaded, respectively. The freefile variable is nonzero if the file is free (no download charge), or zero if not. The idvariable contains the 4 character Directory ID of the file. The descrip variable contains the description of the file (5 lines, 45 characters each). The descrip variable is NOT null terminated and is padded with spaces! The deleteflag variable is nonzero if the file is flagged for deletion, zero if not. The FileBase index files have a one-character extension that is the first letter in their file name. The records in the FileBase index files have the following format: struct fileindexrecord { unsigned char file[13]; unsigned char id[5]; long record; long binarydate; } The file variable contains the file name of the file. The id variable contains the 4 character Directory ID of the file. The record variable contains the actual record (again, first record in data file is # 0) in the FileBase data file where complete information on the file is stored. The binarydate field contains the file's date as a long integer. This value is obtained by rearranging the fields of the date to YYMMDD and then taking the value into a long integer (ie: 10/12/90 = 901012). User File Format ---------------- In the Users data file (extension ".DAT"), each record is 1695 bytes long. Each user entry in the file has the following format: struct userrecord { unsigned char name[26]; unsigned char userpass[21]; int security; int expert; unsigned char city[21]; unsigned char lastdate[9]; unsigned char lasttime[6]; unsigned char newfchk[9]; int downloads; int uploads; int elapsedmins; unsigned char page; unsigned char voice[14]; unsigned char data[14]; unsigned char protocol; int timeson; unsigned int doorsent; unsigned int msgsent; unsigned char confs[25]; long lastmsg[200]; unsigned char expiredate[9]; int expiresec; unsigned char econfs[25]; unsigned char birthdate[9]; unsigned char sysopcomment[61]; unsigned char fileforuser[41]; unsigned char autopage; unsigned char userscanconfs[25]; int deleteuser; unsigned char reserved2; double kuploaded; double kdownloaded; unsigned char fsdefault; int clrscrn; int timestored; long kbytesdled; unsigned char reserved[6]; } The name variable is the full name of the user. The userpass variable contains the user's password. The security variable contains the user's security level. The expert variable is nonzero if the user has turned on expert mode, zero if not. The city variable contains the user's city/state. The lastdate and lasttime variables (in "MM/DD/YY" and "HH:MM" form, respectively) contain the last date and last time on which the user called the BBS. The newfchk variable (in "MM/DD/YY" format) contains the last date that the user checked for new files. The downloads and uploads variables contain the number of downloads and uploads the user has done on the BBS. The elapsedmins field contains the elapsed minutes that the user has spent on the BBS in all his calls on the last date he called. The page variable contains the user's screen page length. The voice and data variable contains the user's voice and data phone numbers, respectively. The protocol variable contains the user's default transfer protocol. The timeson, doorsent, and msgsent variables contain the number of times the user has logged on, the number of doors he has opened, and the number of messages he has entered, respectively. The confs variable is a 25-byte (NOT null terminated) field that consists of 200 bits, each representing one conference in the user's conference string (for example, bit 0 of the first byte is conference 0, bit 2 of the second byte is conference 10). The lastmsg[] array is a 200-element array of long integers, representing the last message number read in each conference (0-199). The expiredate (in "MM/DD/YY" format) contains the date on which the user's subscription will expire ("00/00/00" means it won't expire). The expiresec variable contains the security level to set this user to after his subscription expires. The econfs variable is the same format as the confs variable described above, but is the conference string to set the user to after his subscription expires. The birthdate variable contains the date (in "MM/DD/YY" format) on which the user was born. The sysopcomment variable contains the comment which the sysop has put on this user. The fileforuser variable contains the name of a file to display to the user upon login (a 0 length string if no file should be displayed). The autopage character should be set to 'N', 'I', or 'V'. An 'N' means that no autopage will be done when this user logs on. If it is set to 'I' or 'V', an invisible or visible (respectively) autopage will be executed when the user logs in. The userscanconfs variable works the same way as the two conference variables mentioned above. It defined the conferences that will be scanned upon login, with the (Y) command, with (R A), for offline reading, etc. The deleteuser variable, if set to a nonzero value, means the user is marked for deletion, otherwise the user is not marked for deletion. The reserved2 variable is reserved for future use and should be left alone. The kuploaded and kdownloaded variables (stored as double precision values in IEEE format) store the number of kilobytes (bytes / 1024) that the user has uploaded and downloaded, respectively. The fsdefault variable should be set to a value of 0, 1, or 2. A 0 means to ask the user if he wishes to use the full screen editor each time he enters a message. A 1 means that the user wishes to use the full screen editor whenever possible, and a 2 means to not use it whenever possible. The clrscrn variable, if set to a nonzero value, means that the user wishes the screen to be clear prior to reading each message; otherwise, the screen is not cleared. The timestored variable stored the amount of time (in minutes) that the user has stored in the time bank. The kbytesdled variable stores the number of kilobytes that the user had downloaded on his last date on. The reserved variable is reserved for future use and must be set to all nulls. The User File index files have a one-character extension that is the first letter in the full name of the user. The records in the user index files have the following format: struct userindexrecord { unsigned char username[26]; long record; } The username field is the full name of the user, and the record field is the record (again, record # 0 is the first record in the data file) in the users data file of this user. Conferences Data File Format ---------------------------- In the conferences data file, each record is 2717 bytes long. The first record in the file contains the information for Conference # 0, the second record contains the information for Conference # 1, and so on. The format of each record is as follows: struct confrecord { unsigned char confname[41]; int allowalias; int echoconf; int allowesc; int maxdir; unsigned char msgsfile[41]; unsigned char mainmenufile[41]; unsigned char sysopmenufile[41]; unsigned char newsfile[41]; unsigned char uploaddir[31]; int defaultfiledir; unsigned char doormenu[41]; unsigned char doorlst[41]; unsigned char bltmenu[41]; unsigned char bltlst[41]; unsigned char quesmenu[41]; unsigned char queslst[41]; unsigned char dirmenu[41]; unsigned char votingmenu[41]; unsigned char votinglst[41]; int allowupload; struct dirinfo {char dirid[5]; int dirsec; } dir[300]; } The confname variable is the name of this conference. The allowalias variable, if set to nonzero means that aliases will be allowed in this conference, else aliases will not be allowed. If echoconf is nonzero, then this conference is designated as 'echo', and users entering messages will be prompted as to whether they wish to make their messages 'echo' or not. If allowesc if nonzero, then users are allowed to use ESC (usually ANSI) codes in their messages. The maxdir variable contains the highest directory number in this conference. The msgsfile variable contains the name (without extension) of the message file for this conference. The mainmenufile, sysopmenufile, newsfile, and uploaddir variables contain the names for the main menu file, the sysop menu file, the news file, and the directory to place uploads, respectively. The defaultfiledir variable stores the default file directory number to place uploaded files in. The doormenu, doorlst, bltmenu, bltlst, quesmenu, queslst, dirmenu, votingmenu, and votinglst variables contain the file names of the door menu, door data file, bulletins menu, bulletins data file, questionnaire menu, questionnaire data file, file directory menu, voting booths menu, and voting booths data file. If the allowupload variable is zero, then uploads will not be allowed in this conference. The dir[] array is an array of 300 structures, each containing a 4 character directory ID and the security required to download files from that directory ID. All elements of dir[] above the maxdir number are ignored. NODEINFO File Format -------------------- The NODEINFO file contains 99 records, each corresponding to a node on the system. Any records above your highest node number are ignored, but should still be there. The format of each node's record is as follows (71 byte record length): struct noderecord { unsigned char status; unsigned char groupsummons; unsigned char nodepage; unsigned char nodebeeps; unsigned char lasteventdate[9]; unsigned char lasteventtime[6]; unsigned char nodeuser[26]; unsigned char logoffflag; unsigned char nodedoor[21]; int exittodos; int lasteventnumber; int pagingsysop; } The status variable contains the status of this node. Possible values are as follows: 0 = UltraBBS isn't loaded on this node 1 - 99 = User is in a private (1-99) channel in node chat 100 = User is available for chat 101 = User is unavailable for chat 102 = User is entering a message 103 = User is in a door 104 = User is in remote DOS 105 = User is transferring a file 108 = User is in main channel of node chat 109 = This node is waiting for calls 110 = User is chatting with sysop 111 = User is logging onto BBS (not at main menu yet) The groupsummons variable is nonzero if this node is being summoned to group chat. After displaying the summons to the user, this flag is set to zero. The nodepage and nodebeeps variables record the state of the page bell and beeps on this node (nonzero = on, zero = off). The lasteventdate and lasteventtime variables (in "MM/DD/YY" and "HH:MM" formats) store the date and time of the last event run on this node. The nodeuser variable stores the user name of the user on this node. The logoffflag variable, if set to 1, it means that the user on this node has a logoff pending. If it is set to 2, it means that the user on this node has a lockout pending. The nodedoor variable stores the name of the door that the user on this node is in, if he is in a door. The exittodos variable, if nonzero, means that this node should exit to DOS after the current caller, or if no caller is online, it should exit to DOS immediately. The lasteventnumber variable stores the number of the last event that was executed. The pagingsysop variable is nonzero if the user is currently paging the sysop, zero if he is not. Callers File Format ------------------- The callers file for each node is created by taking the name specified in the SETUP program, and appending the current node number (for example, if Node 1's callers log would be CALLER1, then Node 99's callers log would be CALLER99). Each entry in the callers log is exactly 79 bytes long. The last two bytes are a CR/LF sequence (ASC 13, ASC 10). The file, when TYPEd, appears to be a text file, but must NOT be modified as a text file! Doors Data File Format ---------------------- The first record in the doors data file is door # 1, the second record is door # 2, etc. The format of each record is as follows (98 byte record length): struct doorrecord { unsigned char doorname[21]; unsigned char doorfile[41]; int doorsec; unsigned char doorpass[21]; unsigned char doortype[11]; int doorwatch; } The doorname variable contains the name of this door. The doorfile variable contains the full path (and any parameters) to the .BAT file for this door. The doorsec variable contains the security level required to access this door. The doorpass variable contains the password required to access this door (a 0 length string if no password is required). The doortype variable contains the door type which will be used for the CONVERT program. The doorwatch variable, if nonzero, means that the FOSSIL will reboot the computer if the user hangs up in this door. Questionnaires Data File Format ------------------------------- The first record in the questionnaires data file is questionnaire # 1, the second is questionnaire # 2, etc. The format of each record is as follows (126 byte record length): struct quesrecord { unsigned char quesname[21]; unsigned char quesfile[41]; unsigned char ansfile[41]; int quessec; unsigned char quespass[21]; } The quesname variable is the name of this questionnaire. The quesfile and ansfile variables are the file names of the questionnaire script file, and the output answers file, respectively. The quessec variable is the security required to answer this questionnaire, and the quespass variable is the password that is required (a 0 length string means no passworD). Voting Booths Data File Format ------------------------------ The first record in the voting booths data file is voting booth # 1, the second is voting booth # 2, etc. The format of each record is as follows (1388 byte record length): struct votingrecord { unsigned char votingname[46]; unsigned char datafile[41]; int votingsec; unsigned char votingpass[21]; unsigned char choices[18][71]; } The votingname variable is the question presented by this voting booth. The datafile variable contains the name of the voting results data file for this voting booth. The votingsec & votingpass variables contain the security required for this voting booth, and the password required for the booth (0 length password means no password). The choices[] array is an 18 element array containing strings of the 18 possible responses. Bulletins Data File Format -------------------------- The first record in the bulletins data file is bulletin # 1, the second record is bulletin # 2, etc. The format of each record is as follows (64 byte record length): struct bltrecord { unsigned char bltfile[41]; unsigned char bltpass[21]; int bltsec; } The bltfile variable contains the file name of the actual bulletin. The bltpass & bltsec variables contain the password (0 length means no password) and the security required to access this bulletin. No Uploads File Format ---------------------- The format of a record in the no uploads file is as follows (43 byte record length): struct nouprecord { unsigned char file[41]; int upsecurity; } The file variable is the wildcard specification for this entry. The upsecurity variable contains the minimum security level required to upload a file that matches the wildcard spec. Compression Methods Data File Format ------------------------------------ The first record in the compression methods data file will be the default compression method for use in Qmail packets. The format for each entry is as follows (224 byte record length): struct comprecord { unsigned char ext[4]; unsigned char viewform[51]; unsigned char addform[51]; unsigned char getform[51]; unsigned char testform[51]; unsigned char badtext[16]; } The ext variable contains the 3 character extension used by this compression method. The viewform, addform, getform, and testform store the command line needed to execute the various functions. See the UltraBBS sysop documentation for more information on what these strings should look like. The badtext variable contains the text that the compressor will display if a file is bad during an integrity check. Protocols Data File Format -------------------------- The format of each record in the protocols data file is as follows (109 byte record length): struct protrecord { unsigned char letter; unsigned char batch; unsigned char uload[41]; unsigned char dload[41]; unsigned char protname[21]; int atsign; int dszlog; } The letter variable is the letter used to select this protocol from the BBS. The batch variable should be set to 'S', 'M', or 'B' for single file, multiple files, or bidirectional multiple files. The uload and dload variables store the name of the batch file for uploads and downloads, respectively (dload variable is used for bidirectional transfer batch files). The protname variable contains the name of this protocol. The atsign variable, if nonzero, means that this protocol supports the '@listfile' command line parameter, to transfer up to 99 files instead of just 6 or 7. The dszlog variable, if nonzero, means that this protocol will write a DSZ.LOG file after a download. Limits Data File Format ----------------------- The format of each record in the limits data file is as follows (14 byte record length): struct limitsrecord { int limitssec; int limitsmins; int kbytesperup; int filesperup; int doornumber; long kbytesperday; } The limitssec variable is the security for which this record applies. The limitsmins variable is the number of minutes that this security level will get each day. The kbytesperup (stored as a double precision IEEE format number) and filesperup variables determine how many Download Kilobytes the user may have for each 1 Upload Kilobyte; and the number of Download Files the user may have for each 1 Upload File. To negate the function of either, set it to 0. The doornumber variable contains the door number which will be automatically opened when any user of this security level logs on. The kbytesperday variable stores the number of kilobytes that a user of this security level can download per day. Voting Results Data File Format ------------------------------- A voting results data file contains records 27 bytes in length for each user who has voted (a user will not appear more than once in the file). The format of each record is as follows: struct votedrecord { unsigned char name[26]; unsigned char choice; } The name variable is the name of the user to which this vote applies, and the choice variable is the choice number which he voted for. Node Chat Data File Format -------------------------- Each record (one character typed in node chat) is 3 bytes in the node chat data file. The first byte of the record is a char that should be set to the channel # that this message is going through (0-99). If the record is representing a character, then the second byte of the record should be set to the number of the node that is sending the character, and the third byte should be set to the actual character. If the record is to notify of an exit/entrance/hangup/etc, then the second byte should be set to 253 for a force off (hang up, etc), 254 for an entrance, and 255 for an exit; and the third byte should be set to the node number to which this exit/entrance/hangup applies to. UBBS.SYS Door Exit File Format ------------------------------ The UBBS.SYS file is created before exiting to a door, and is read back in by UltraBBS upon returning to obtain info about who is on. This file is usually just used by CONVERT to make other, more commonly used, door files, but some software authors may wish to use it to alter user information, or obtain more detailed, UltraBBS-specific information. Its format is as follows: struct ubbs_sysfile { long modembaud; long callerbaud; int eight_bit; char time_on[6]; char date_on[9]; int kbytesperup; int filesperup; long kbytesperday; int graphics; long userpos; int local_user; int confnum; char confsjoined[200]; char prevdate[9]; char prevtime[6]; int disable_remote; int available; long logon_time; long secs_session; long elapsedsecs; long eventadjust; char markedfiles[99][13]; unsigned char markednum; char oldfchk[9]; -------------------- Variables below this line are write-only. UltraBBS does not read them in upon returning from a door. If you wish to modify other variables, do so in the users file! char bbsname[31]; char sysopname[26]; char curtime[6]; char page_bell; char beeps; int junk; long timeused; char eventtime[6]; int eventactive; int port; char usermixed[26]; int minsremaining; char node; struct user currentuser; } The modembaud variable contains the actual bps rate (locked bps rate) of the port. The callerbaud variable contains the bps rate the caller is actually communicating at. eight_bit is nonzero if the caller is 8N1, zero if 7E1. The time_on string contains the time at which the caller logged on (HH:MM format), and date_on contains the date at which he logged on (MM/DD/YY format). kbytesperup and filesperup contain the number of kilobytes that this user may download per kilobyte he uploads, and files he may down per file he uploads (a value of 0 sets these to unlimited). The graphics variable is 0 if (N)o graphics, 1 if (B)lack & White graphics, 2 if (C)olor graphics. The userpos variable contains the user's position in the user file (the first record in user file is rec # 0). local_user is nonzero if the user is on local, zero if remote. confnum contains the current conference number the user is in. confsjoined is a non-null terminated string that contains spaces or 'X's, specifying which conferences the user has joined during the current call. The prevdate and prevtime variables (MM/DD/YY and HH:MM) contain the date and time of the user's last call (before this one). disable_remote if nonzero if the remote user's keyboard is disabled, zero otherwise. available is nonzero if the user is available for chat, zero otherwise. logon_time contains the seconds at which the user logged in (# of seconds elapsed since 00:00:00 Greenwich mean time, January 1, 1970). secs_session contains the number of seconds this user has per call (obtained from LIMITS.DAT). elapsedsecs is the number of seconds this user has used in calls earlier today. eventadjust is the number of seconds the user has lost today because of time adjustments due to upcoming events. markedfiles is an array of strings (containing 99 strings) containing which files the user has marked to download via the (FL) command. markednum contains the number of files the user has marked. oldfchk contains the last date (MM/DD/YY format) which the user checked for new files. bbsname contains the name of the BBS. sysopname is the name of the sysop, in all caps. The curtime variable contains the time (HH:MM format) that this UBBS.SYS file was created. The page_bell variable is true (nonzero) if the page bell is on, zero if it's off. beeps is nonzero if beeps/music is on, zero otherwise. The junk variable is not used. timeused contains the amount of time (in seconds) the user has used so far today. eventtime contains the time (HH:MM format) of the next event. eventactive is nonzero if any events are configured, zero otherwise. port contains the COM port number of the current COM port (0=COM1, 1=COM2, 2=COM3, etc). usermixed contains the mixed case name of the user (ie: 'Bob Farmer'). minsremaining contains the time, in minutes, that the user has remaining as of the creation of this UBBS.SYS file. This variable can be used, possibly in conjunction with the curtime variable, to quickly obtain a time left calculation. The node variable contains the node # of this node. The currentuser structure is in the same format as a record in the user file (see above), and contains the user record of the current user. Caller Number Data File Format ------------------------------ The caller number data file is 4 bytes, and simply contains a single long integer which is the number of calls made to the system. UltraBBS's UBBS.DAT File Format ------------------------------- The UBBS.DAT file is a line-by-line, sequential text file maintained by the SETUP program. The lines, in order, are as follows: Maximum # of Messages for (O) and (D C) Event # 1 Guard Time Event # 2 Guard Time Event # 3 Guard Time Security to Edit His Own Messages Use BIOS Output? Security for (6) BBS Listing Data File Name Security for (BB) Use Terse Caller Logging? Caller Number File Name Number of Rings to Skip Before Answering Instant Logon Password Event # 2 Active? Event # 3 Active? Event # 2 Time Event # 3 Time Security for (11) Security for (TI) Maximum Storable Time in (TI) Check Message 'To' Field? Delete the File For User? Birthday File Name Security for (10) Start of SysOp Page Hours End of SysOp Page Hours Holding Directory Name Scratch Directory Name No New Users File Name FileBase File Name Help Prefix File Name Conference Data File Name Conference Menu File Name Caller File Prefix File Name Node Chat File Name Welcome File Name Goodbye File Name Limits Data File Name NODEINFO Data File Name Protocols Data File Name User Data File Name No Registration File Name No Uploads Data File Name Low Security File Name New User File Name Remote DOS Batch File Name Aliases Data File Name User Security Files Path Name Event # 1 Time BBS Name SysOp's Name Initialization Command Answer Command Off-Hook Command Batch Directory Name Public Conferences String (exactly 200 chars) New User Questionnaire File New User Answers File Expired Subscription File Name Compression Data File Name Post-Upload Batch File Name Node Number Communications Port Allow New Users? Security to Overwrite Files RTS/CTS Checking? Test Uploads? Security for (M)ultiple Copy Save Security to Read Killed Messages Security to Edit/Move Messages Security to Kill Any Messages Security to Skip Message Password Security to Leave Message To SysOp Initialization Baud Rate Page Bell FIle Name Private Directory ID Security for (G X) Highest Node Number Minimum Security to Logon Security to Classify Files Use Post-Upload Batch File? New User Security Allow Aborting of Welcome? Lowest Baud Rate Allowed Seconds Allowed for Registration Security to Read Private Messages Seconds Between Node Checks SysOp Menu Security Upload Time Credit Factor Seconds of Idle Time Allowed Security to Edit Any Description Security to Import File into Message Lock Baud Rate? Allow 7E1 Callers? Event # 1 Active? Shell to Doors? Reboot on DOS Hangup? Shell to DOS? Security for (NO)/(CH) Security for (B) Security for (W) Security for (OP)/(DO) Security for (G) Security for (I) Security for (J) Security for (K) Security for (O) Security for (P) Security for (Q) Security for (R) Security for (S) Security for (US) Security for (V) Security for (X) Security for (Y) Security for (1) Security for (2) Security for (3) Security for (4) Security for (5) Security for (7) Security for (8) Security for (BI) Security for (D) Security for (ED) Security for (U) Security for (Z) Security for (VI) Security for (RE) Security for (F) Security for (N) Security for (E) Security to Page Unavailable Users Security for (WH) Security for (L) Security to Request Return Receipt Security to Forward a Message Pre-Upload File Name Qmail Offline ID BBS City/State BBS Phone Number Qmail Menu File Name Security for (FL) File Attach Directory Name Allow Non-2-Word Names? Continue After Modem Init Failure? Security for (9) Information for BASIC Programmers --------------------------------- All numbers are stored in IEEE format. Variable information: An 'unsigned char' or a 'char' is a numerical value stored in one byte. To convert it to BASIC, read it in as a 1-character string (A$, for example), then, to get its value into a variable, (A%, for example), use A% = ASC(A$). An 'int' or an 'unsigned int' is a 2-byte number, equivalent to BASIC's INTEGER type (%). A 'long' or an 'unsigned long' is a 4-byte integral number, equivalent to QuickBASIC's LONG INTEGER type (&). A 'double' is an 8-byte floating point number, equivalent to BASIC's DOUBLE type (#). NOTE: older versions of Microsoft's QuickBASIC store DOUBLEs in Microsoft Binary format, remember, these are in IEEE format - 4.0+ of QuickBASIC is fine. A 'float' is a 4-byte floating point number, equivalent to BASIC's SINGLE type (!). NOTE: older versions of Microsoft's QuickBASIC store SINGLEs in Microsoft Binary format, remember, these are in IEEE format - 4.0+ of QuickBASIC is fine. Any numerical type with a number in brackets after the variable name is an array of the number of elements specified in brackets. Two pairs of brackets means a two-dimensional array, etc. An 'unsigned char ....[]' value (unless it is literally an array of char values) is a string. The value in brackets is the max length of the string. However, all strings are null terminated. First, this means that the 'max length of the string' in brackets will actually be one more than the true max length. Second, at the end of all meaningful characters in the string, there will be a null (ASCII 0) character, followed by unpredictable trash. The strings are NOT padded with spaces! When reading in these "string" values, use a BASIC STRING of the length in the brackets, and this command may be used afterwards to obtain a true BASIC string: REAL.STRING$ = LEFT$(STRING.FROM.FILE$, INSTR(STRING.FROM.FILE$, CHR$(0))-1) Some arrays of unsigned char are not actually strings, but as mentioned earlier, literally arrays of char values, and when this is the case, it is mentioned in the description of that structure in this document. Information for Pascal Programmers ---------------------------------- An 'unsigned char' type corresponds to Turbo Pascal's byte type. A 'char' type corresponds to Turbo Pascal's shortint type. An 'unsigned int' type corresponds to Turbo Pascal's word type. An 'int' type corresponds to Turbo Pascal's integer type. An 'unsigned long' or 'long' type corresponds to Turbo Pascal's longint type. A 'double' is an 8-bit floating point type, and a 'float' is a 4-bit floating point type. Their Pascal equivalent types vary widely. See your compiler guide, and remember, these are in IEEE format. Any numerical type with a number in brackets after the variable name is an array of the number of elements specified in brackets. Two pairs of brackets means a two-dimensional array, etc. An 'unsigned char ....[]' value (unless it is literally an array of char values) is a string. The value in brackets is the max length of the string. However, all strings are null terminated. First, this means that the 'max length of the string' in brackets will actually be one more than the true max length. Second, at the end of all meaningful characters in the string, there will be a null (ASCII 0) character, followed by unpredictable trash. The strings are NOT padded with spaces! When reading in these "string" values, use a packed array of char of the length in the brackets. The true length of the string will be the position of the first ASCII 0 (null) minus one (assuming first char in the string is pos # 1). Some arrays of unsigned char are not actually strings, but as mentioned earlier, literally arrays of char values, and when this is the case, it is mentioned in the description of that structure in this document.