Annotation of sbbs/sbbs2/smb/121a/smb.prn, revision 1.1.1.1

1.1       root        1:        
                      2:        
                      3:        
                      4:        
                      5:        
                      6:        
                      7:        
                      8:        
                      9:        
                     10:        
                     11:        
                     12:        
                     13:        
                     14:        
                     15:        
                     16:        
                     17:        
                     18:        
                     19:        
                     20:                             Synchronet Message Base Specification
                     21:                                         Version 1.21
                     22:                                       Updated 08/31/95
                     23:        
                     24:                                Copyright 1995 Digital Dynamics
                     25:        
                     26:                                          PO Box 501
                     27:                                     Yorba Linda, CA 92686
                     28:        
                     29:                         Voice: 714-529-6328   BBS: 714-529-9525 V.32/V.32bis
                     30:                           FAX: 714-529-9721        714-529-9547 V.FC
                     31:                          Fido: 1:103/705      ftp: netcom.com /pub/sb/sbbs
                     32: 
                     33: 
                     34: 
                     35: 
                     36: 
                     37: 
                     38: 
                     39: 
                     40: 
                     41: 
                     42: 
                     43: 
                     44: 
                     45: 
                     46: 
                     47: 
                     48: 
                     49: 
                     50: 
                     51: 
                     52: 
                     53: 
                     54: 
                     55: 
                     56: 
                     57: 
                     58:        Table of Contents
                     59:        =================
                     60:        
                     61:        Introduction.............................................................3
                     62:        Implementation Levels....................................................8
                     63:        Definitions.............................................................10
                     64:                Acronyms........................................................12
                     65:                Data Types......................................................13
                     66:        File Formats............................................................18
                     67:                Index.....................(*.SID)...............................18
                     68:                Header....................(*.SHD)...............................20
                     69:                Header Allocation.........(*.SHA)...............................30
                     70:                Data......................(*.SDT)...............................31
                     71:                Data Allocation...........(*.SDA)...............................32
                     72:                CRC History...............(*.SCH)...............................33
                     73:        Header Field Types......................................................34
                     74:        Data Field Types........................................................58
                     75:        Messsage Attributes.....................................................60
                     76:        Translation Types.......................................................61
                     77:        Agent Types.............................................................62
                     78:        Network Types...........................................................63
                     79:        Media Types.............................................................64
                     80:        Message Storage Pseudo Code.............................................67
                     81:        Message Retrieval Pseudo Code...........................................69
                     82:        SMBUTIL.................................................................70
                     83:        CHKSMB..................................................................71
                     84:        FIXSMB..................................................................72
                     85:        SMBLIB (C library)......................................................73
                     86:                Data Types and Constants..(SMBDEFS.H)...........................74
                     87:                Global Variables..........(SMBVARS.C)...........................75
                     88:                Function Prototypes.......(SMBLIB.H)............................76
                     89:                Library Functions.........(SMBLIB.C)............................77
                     90:                Miscellaneous.............(CRC*.* and LZH.*)....................84
                     91:        SMBLIB Storage Example..................................................86
                     92:        SMBLIB Retrieval Example................................................89
                     93:        SMBLIB Performance Issues...............................................91
                     94:        Bibliography............................................................95
                     95:        Implementations.........................................................96
                     96: 
                     97: 
                     98: 
                     99: 
                    100: 
                    101: 
                    102: 
                    103: 
                    104: 
                    105: 
                    106: 
                    107: 
                    108: 
                    109: 
                    110: 
                    111: 
                    112: 
                    113:        _______________________________________________________________________________
                    114:        Synchronet                            2                                Contents
                    115: 
                    116: 
                    117:        Introduction
                    118:        ============
                    119:        
                    120:        Q. What is SMB?
                    121:        
                    122:        A. SMB (Synchronet Message Base) is a technical specification for the storage
                    123:           format of electronic mail messages. These e-mail messages may all be
                    124:           contained in one database, or, more commonly, separated into catagorized
                    125:           databases. These message databases (or message bases) are also referred to
                    126:           as "sub-boards", "forums", "conferences", and "SIGs". The messages may be
                    127:           directed to an individual person, sent to a group of individuals, or sent
                    128:           to everyone who can read messages in that message base. Messages may be
                    129:           created and read soley at one physical location, or imported from and
                    130:           exported to a message network that may span continents. Message bases that
                    131:           are connected to a message network are often called "echoes".
                    132:        
                    133:        
                    134:        Q. Why SMB?
                    135:        
                    136:        A. The Synchronet Message Base is designed to store high volumes of messages
                    137:           while maintaining optimum search, retrieval, and creation performance.
                    138:           These messages are not limited to mere text. In addition to text, SMB
                    139:           defines the storage of digitized sound, MIDI, graphics, fonts, animation,
                    140:           as well as other multimedia data and triggers for localized multimedia.
                    141:           SMB thrives on a multi-user environment where messages are being created,
                    142:           read, modified, and deleted by multiple tasks simultaneously. With the
                    143:           large message networks of today being the rule, rather than the exception,
                    144:           and high volumes of messages being imported on a daily, sometimes hourly
                    145:           basis, creation and deletion speed is of the utmost importance. This is
                    146:           where SMB really shines. Being extensible enough to handle message formats
                    147:           from networks of today and tomorrow, and fast enough to import more messages
                    148:           that humanly readable, the SMB format will more than meet your message
                    149:           storage needs.
                    150:        
                    151:        
                    152:        Q. Why a specification?
                    153:        
                    154:        A. Message bases are often accessed and modified by a number of different
                    155:           programs. Often these programs are developed by individuals or companies
                    156:           other than the original designer of the message base format. This
                    157:           specification is an attempt to aid developers in creating programs that
                    158:           access or modify a message base stored in the SMB format.
                    159:        
                    160:        
                    161:        Q. Who can use this specification?
                    162:        
                    163:        A. Anyone that has interest in the Synchronet Message Base format at either
                    164:           an educational or professional level. Specifically, software developers
                    165:           interested or currently involved in the development of message readers,
                    166:           editors, echomail (toss/scan) programs, message transfer agents (MTAs),
                    167:           network gateways, and bulletin board systems. Much of the information in
                    168:           this specification is intended for those with preexisting programming
                    169:           knowledge, so those with little or no programming experience may find it
                    170:           hard to comprehend.
                    171: 
                    172:        _______________________________________________________________________________
                    173:        Synchronet                            3                            Introduction
                    174: 
                    175: 
                    176:        
                    177:        
                    178:        Q. What does the SMB specification include?
                    179:        
                    180:        A. The text you are reading is part of the SMB specification: a single text
                    181:           document that defines the storage format of each of the six files of an
                    182:           SMB format message base and how they are related to each other.
                    183:        
                    184:           Included with this specification is C source code to be used as an example
                    185:           to programmers of how to access an SMB format message base and public domain
                    186:           library functions (SMBLIB) that can be compiled and linked into programs
                    187:           that access an SMB format message base developed by third parties. An SMB
                    188:           utility program (SMBUTIL) is also included with C source code as an example
                    189:           of how to use the SMBLIB functions.
                    190:        
                    191:        
                    192:        Q. Where did the SMB specification come from?
                    193:        
                    194:        A. Digital Dynamics (southern California based software development company)
                    195:           released "Synchronet Multinode BBS Software Version 1a" in June of 1992 as
                    196:           one of the first BBS packages to be designed from the ground-up to operate
                    197:           in a multinode environment with incredible speed and reliability, with a
                    198:           large suite of multinode specific features and design innovations.
                    199:        
                    200:           The original message base format was designed with localized messaging and
                    201:           low volume message networks in mind. By January of 1993, it was clear that
                    202:           high volume message networks (FidoNet, RelayNet, Usenet, etc.) were the
                    203:           preference of most BBS users and a new message base format was required to
                    204:           allow for high volume message storage, improved storage, retrieval, and
                    205:           maintenance performance, as well as lower storage space requirements.
                    206:        
                    207:           Rather than introduce another new message format, Digital Dynamics sought
                    208:           to implement an existing public specification for a format that would meet
                    209:           current and future message storage needs. More than a few specifications
                    210:           were seriously considered at one time or another, but after careful
                    211:           examination, design flaws and lack of extensibility eliminated them from the
                    212:           long term plans of Digital Dynamics and Synchronet BBS Software. Thus began
                    213:           the design of the "Synchronet Message Base" (SMB) format.
                    214:        
                    215:           At the request of many message related program developers, Digital Dynamics
                    216:           created and released the SMB specification before the release of "Synchronet
                    217:           Version 2.00" to allow lead-time on developing support programs for the new
                    218:           format.
                    219:        
                    220:           Digital Dynamics strongly encourages developers of message related programs
                    221:           (including software that directly competes with Synchronet or other Digital
                    222:           Dynamics products) to implement support for SMB. Though this is a public
                    223:           specification and Digital Dynamics encourages developer suggestions, it will
                    224:           remain under the sole control of Digital Dynamics unless specifically stated
                    225:           otherwise in a future revision of this specification.
                    226:        
                    227:           Digital Dynamics requests that any organizations that wish to adopt or
                    228:           ratify this specification, in part or whole, notify Digital Dynamics through
                    229:           any of the contact methods listed at the beginning of this document.
                    230: 
                    231:        _______________________________________________________________________________
                    232:        Synchronet                            4                            Introduction
                    233: 
                    234: 
                    235:        
                    236:        
                    237:        Q. How does SMB store messages?
                    238:        
                    239:        A. Each message base is stored in a set of binary files. This set consists
                    240:           of between three and six files depending the storage method used. The base
                    241:           filename (maximum of eight characters under DOS) is the same for all six
                    242:           files of the same message base and unique amoung the filenames of other
                    243:           message bases in the same directory. The six files each have a different
                    244:           three character extension. The first character of the extension is always
                    245:           the letter 'S' (for SMB), while the second and third characters define the
                    246:           contents of the file.
                    247:        
                    248:           Two of the six files associated with each message base are not recreatable
                    249:           and therefore are the most important when considering data integrity. These
                    250:           two files are the data file (with a .SDT extension) and header file (.SHD
                    251:           extension). Both of these files use 256 byte blocks and have associated
                    252:           block allocation tables (stored in .SDA and .SHA respectively) so that
                    253:           deleted message blocks may be used by new messages without creating odd
                    254:           sized unused 'holes' in the files. The block allocation table files (.SDA
                    255:           and .SHA) can be recreated with the information stored in the header (.SHD)
                    256:           file. When using Hyper Allocation storage method, the allocation files (.SDA
                    257:           and .SHA) are not used.
                    258:        
                    259:           For fast indexing, there is a small fixed length index file (with a .SID
                    260:           extension). This file allows for the immediate location of message header
                    261:           records based on sender's name or user number, recipient's name or user
                    262:           number, subject, message number, or message attributes. This file can be
                    263:           recreated with the data stored in the header (.SHD) file.
                    264:        
                    265:           The last file is an optional CRC history (.SCH) file. It contains 32-bit
                    266:           CRCs of a configurable number of messages imported or created locally. This
                    267:           is to help eliminate duplicate messages created by user or program error.
                    268:           The CRC history file can be recreated with the combination of information
                    269:           stored in the data (.SDT) and header (.SHD) files.
                    270: 
                    271: 
                    272: 
                    273: 
                    274: 
                    275: 
                    276: 
                    277: 
                    278: 
                    279: 
                    280: 
                    281: 
                    282: 
                    283: 
                    284: 
                    285: 
                    286: 
                    287: 
                    288: 
                    289: 
                    290:        _______________________________________________________________________________
                    291:        Synchronet                            5                            Introduction
                    292: 
                    293: 
                    294:        Q. How fast do messages import into an SMB message base?
                    295:        
                    296:        A. This is a very important question for systems for that import large volumes
                    297:           of messages. Of course, the answer depends on the storage format which you
                    298:           are importing from, the average length of messages, the design of the
                    299:           program which is peforming the import process, as well as the hardware and
                    300:           system software being used. What's important is that SMB will allow the
                    301:           fastest import process possible with any given combination of the above
                    302:           factors.
                    303:        
                    304:           Since system storage capacity is rarely infinite, neither is the number
                    305:           of messages which can be stored in a message base. System operators must
                    306:           define the maximum number of messages to be stored in a message base, the
                    307:           maximum age of the messages in that message base, or a combination of both.
                    308:           When using the Self-packing storage method (defined later in this document),
                    309:           the smaller the number of messages stored in a message base, the faster the
                    310:           import process. The SMB format is flexible enough to support multiple levels
                    311:           of import performance based on optimizations for storage space or speed.
                    312:           Most system operators will almost invariably choose speed over space, but
                    313:           which choices are available is determined by the importing program. This
                    314:           specification defines three storage methods, from slowest to fastest:
                    315:           Self-packing, Fast Allocation, and Hyper Allocation. Other options defined
                    316:           in this specification may affect storage performance, including duplicate
                    317:           message checking and message compression/encryption.
                    318:        
                    319:        
                    320:        Q. How much storage is required for an SMB message base?
                    321:        
                    322:        A. The biggest factor in determining storage requirements for a message base
                    323:           is the maximum number of messages to be stored in the base (defined by the
                    324:           system operator) and the average size of each message. The minimum required
                    325:           storage for a message base is 32 bytes plus 532 bytes per message (plus four
                    326:           bytes per message if duplicate message checking is used and three bytes
                    327:           per message if Self-packing or Fast Allocation storage methods are used).
                    328:        
                    329:           The SMB format was originally designed to be "self-packing", meaning purged
                    330:           (deleted) message header and data blocks will be used automatically by new
                    331:           messages. Relying solely on self-packing, an SMB format message base will
                    332:           never "shrink" in size. This is not to say that it will continually "grow"
                    333:           in size, but that without specific packing procedures, deleted message
                    334:           blocks may remain unused for extended periods of time, meanwhile using some
                    335:           amount of storage space that could be recovered using specific packing
                    336:           procedures. The Fast Allocation and Hyper Allocation storage methods do not
                    337:           use deleted message blocks for new messages so specific packing procedures
                    338:           must be used if any messages are deleted and that storage space is to ever
                    339:           be recovered.
                    340:        
                    341:           Limiting the maximum age of messages in an SMB message base is another way
                    342:           to control the storage requirements. While maximum message age definition is
                    343:           optional, the definition of the maximum number of messages is not.
                    344: 
                    345: 
                    346: 
                    347: 
                    348: 
                    349:        _______________________________________________________________________________
                    350:        Synchronet                            6                            Introduction
                    351: 
                    352: 
                    353:        Q. How many messages can be stored per SMB message base?
                    354:        
                    355:        A. Without considering storage limitations or message data lengths greater than
                    356:           256, the theoretical maximum number of messages that can be stored in a
                    357:           single SMB message base is 16.7 million. Considering the variable length
                    358:           nature of message and header data, it is suggested that the system operator
                    359:           allow no more than 1 million messages per base.
                    360:        
                    361:           To determine an estimated maximum number of messages for a message base
                    362:           using the average message data length as a factor, use the following
                    363:           formula:
                    364:        
                    365:           4.2 billion divided by the average message length rounded up to be evenly
                    366:           divisible by 256.
                    367:        
                    368:           If the average message data length is 1500 bytes, the estimated maximum
                    369:           number of messages would be 2,734,375 (4.2 billion divided by 1536).
                    370:        
                    371:           Implementations of this format may be further limited by available system
                    372:           memory.
                    373: 
                    374: 
                    375: 
                    376: 
                    377: 
                    378: 
                    379: 
                    380: 
                    381: 
                    382: 
                    383: 
                    384: 
                    385: 
                    386: 
                    387: 
                    388: 
                    389: 
                    390: 
                    391: 
                    392: 
                    393: 
                    394: 
                    395: 
                    396: 
                    397: 
                    398: 
                    399: 
                    400: 
                    401: 
                    402: 
                    403: 
                    404: 
                    405: 
                    406: 
                    407: 
                    408:        _______________________________________________________________________________
                    409:        Synchronet                            7                            Introduction
                    410: 
                    411: 
                    412:        Implementation Levels
                    413:        =====================
                    414:        The SMB format can be implemented to varying degrees between programs without
                    415:        creating compatibilty issues. Rather than have developers specifically state
                    416:        which features they have and have not implemented, we have defined seven levels
                    417:        of implementation (represented by Roman numerals I through VII). For a program
                    418:        or software package to meet an implementation level, it must have all of the
                    419:        features listed for that level and all of those for each level below it. The
                    420:        minimum suggested imlementation is level I. The SMBUTIL program included with
                    421:        this specification is an example of a level I implementation with features
                    422:        from some of the higher implementation levels.
                    423:        
                    424:        Level I
                    425:        -------
                    426:        The minimum suggested level of implementation. Messages contain merely ASCII
                    427:        text displayable on an ANSI terminal. Messages can be added to the message
                    428:        base and if the maximum number of messages is exceeded, messages are removed
                    429:        or marked for deletion.
                    430:        
                    431:        Level II
                    432:        --------
                    433:        The addition of file attachments, multiple index/header entries per message
                    434:        (multiple destinations), multiple text bodies for the separation of message
                    435:        text and tag/origin lines (for example), forwarding, threading, and specific
                    436:        FidoNet kludge header field support makes this level of implementation more
                    437:        realistic for bulletin board system and EchoMail software implementation.
                    438:        
                    439:        Synchronet Multinode BBS Software v2.00 has a level II implementation of this
                    440:        specification.
                    441:        
                    442:        Level III
                    443:        ---------
                    444:        This implementation adds support for translation strings defined later in this
                    445:        document for data compression, encryption, escaping, and encoding. This level
                    446:        is still limited to basic ASCII text and ANSI escape sequence entry and
                    447:        retrieval.
                    448:        
                    449:        Synchronet Multinode BBS Software v2.10 has a level III implementation of this
                    450:        specification.
                    451:        
                    452:        Level IV
                    453:        --------
                    454:        The storage and retrieval of embedded and attached images is added in this
                    455:        level of implementation. Supported images are limited to single binary or text
                    456:        data blocks that can be displayed or transferred to the user (automatically,
                    457:        or by request) if their display and translation protocols define specific
                    458:        support for the image type.
                    459: 
                    460: 
                    461: 
                    462: 
                    463: 
                    464: 
                    465: 
                    466: 
                    467:        _______________________________________________________________________________
                    468:        Synchronet                            8                   Implementation Levels
                    469: 
                    470: 
                    471:        Level V
                    472:        -------
                    473:        This level of implementation adds support for embedded and attached sound data.
                    474:        This includes digitized sound and MIDI data. Supported sounds are limited to
                    475:        single binary or text data blocks that can be played or transferred to the user
                    476:        (automatically or by request) if their presentation and translation protocols
                    477:        define specific support for the sound type.
                    478:        
                    479:        Level VI
                    480:        --------
                    481:        Localized sound and image data can be triggered by messages stored and
                    482:        retrieved in an implementation of this level.
                    483:        
                    484:        Level VII
                    485:        ---------
                    486:        Complete multimedia support is reached in this implementation level with
                    487:        support for embedded and attached animation, sound, and video data.
                    488:        
                    489: 
                    490: 
                    491: 
                    492: 
                    493: 
                    494: 
                    495: 
                    496: 
                    497: 
                    498: 
                    499: 
                    500: 
                    501: 
                    502: 
                    503: 
                    504: 
                    505: 
                    506: 
                    507: 
                    508: 
                    509: 
                    510: 
                    511: 
                    512: 
                    513: 
                    514: 
                    515: 
                    516: 
                    517: 
                    518: 
                    519: 
                    520: 
                    521: 
                    522: 
                    523: 
                    524: 
                    525: 
                    526:        _______________________________________________________________________________
                    527:        Synchronet                            9                   Implementation Levels
                    528: 
                    529: 
                    530:        Definitions
                    531:        ===========
                    532:        
                    533:        Control Characters
                    534:        ------------------
                    535:        When specifying control characters (ASCII 1 through 31), the caret symbol "^"
                    536:        or the abreviation "ctrl-" followed by a character will be used to indicate the
                    537:        value. ^A is equivalent to ASCII 1, ^B ASCII 2, etc. The case of the control
                    538:        character is not significant (i.e. ^z and ^Z are equivalent). The control
                    539:        character ^@ (ASCII 0) will be specified as NULL or 0.
                    540:        
                    541:        
                    542:        Hexadecimal
                    543:        -----------
                    544:        Base sixteen numbering system which includes the digits 0-9 and A-F.
                    545:        Hexadecimal numbers are represented in this document with a prefix of "0x" or
                    546:        "\x" or a suffix of "h". Hexadecimal letter digits are not case sensitive
                    547:        (i.e. the number 0xff is the same as 0xFF).
                    548:        
                    549:        
                    550:        File dump
                    551:        ---------
                    552:        When example file dumps are displayed, the format is similar to that of the
                    553:        output from the DOS DEBUG program. With the exception of the ASCII characters,
                    554:        all numbers are in hexadecimal.
                    555:        
                    556:        Offset    Byte values                                          ASCII characters
                    557:        
                    558:        000000    53 4D 42 1A 10 01 20 00   F4 01 00 00 F4 01 00 00    SMB... .�...�...
                    559:        000010    20 00 00 00 D0 07 00 00   D0 07 00 00 00 00 00 00     ...�...�.......
                    560:        
                    561:        
                    562:        Bit values
                    563:        ----------
                    564:        Bit (or flag) values are represented in C notation as (1<<x) where x is the bit
                    565:        number. (i.e. bit number 7 (1<<7) is the same as 0x80).
                    566:        
                    567:        
                    568:        Word storage
                    569:        ------------
                    570:        All words (16-bit) and double words (32-bit) are stored in Intel 80x86 (little
                    571:        endian) format with bytes stored from low to high (reverse of the Motorola
                    572:        680x0 word storage format).
                    573:        
                    574:        A 16-bit word with the value 1234h is stored as 34h 12h.
                    575: 
                    576: 
                    577: 
                    578: 
                    579: 
                    580: 
                    581: 
                    582: 
                    583: 
                    584: 
                    585:        _______________________________________________________________________________
                    586:        Synchronet                           10                             Definitions
                    587: 
                    588: 
                    589:        Translation strings
                    590:        -------------------
                    591:        Translation strings (xlat variables) are arrays of words (16-bit) in the order
                    592:        of the original storage translation. The last translation type is followed by a
                    593:        16-bit zero (defined later as XLAT_NONE). If there are no translations, then
                    594:        the first and only element of the array is XLAT_NONE.
                    595:        
                    596:        If multiple translations are used, the translation order must be reversed
                    597:        upon retrieval to obtain the proper data.
                    598:        
                    599:        
                    600:        Local e-mail
                    601:        ------------
                    602:        When referring to the local e-mail message base of a Synchronet BBS, we are
                    603:        referring specifically the message base with the name "MAIL" stored in the
                    604:        "DATA" directory (e.g. \SBBS\DATA\MAIL).
                    605:        
                    606:        Messages stored in this message base are different in the following respects:
                    607:        
                    608:            The SMB_EMAIL status header attribute is set ON
                    609:            Hyper Allocation storage method is not supported
                    610:            The "To" and and "From" fields of the message indexes do NOT contain CRCs
                    611: 
                    612: 
                    613: 
                    614: 
                    615: 
                    616: 
                    617: 
                    618: 
                    619: 
                    620: 
                    621: 
                    622: 
                    623: 
                    624: 
                    625: 
                    626: 
                    627: 
                    628: 
                    629: 
                    630: 
                    631: 
                    632: 
                    633: 
                    634: 
                    635: 
                    636: 
                    637: 
                    638: 
                    639: 
                    640: 
                    641: 
                    642: 
                    643: 
                    644:        _______________________________________________________________________________
                    645:        Synchronet                           11                             Definitions
                    646: 
                    647: 
                    648:        Acronyms:
                    649:        ========
                    650:        
                    651:        ANSI            American National Standards Institute
                    652:        ASCII           American Standard Code for Information Interchange
                    653:        BBS             Bulletin Board System
                    654:        C               The C programming language as defined by ANSI X3.159-1989
                    655:        CR              Carriage Return character (ASCII 13)
                    656:        CRC             Cyclic Redundancy Check
                    657:        CRC-16          Standard 16-bit CRC using 1021h polynomial (seed 0)
                    658:        CRC-32          Standard 32-bit CRC using EDB88320h polynomial (seed -1)
                    659:        CRLF            Carriage Return character followed by a Line Feed character
                    660:        FSC             FidoNet Standards Commitee (FTS proposal)
                    661:        FTN             FidoNet Technology Network
                    662:        FTS             FidoNet Technical Standard
                    663:        LF              Line Feed character (ASCII 10)
                    664:        QWK             Compressed message packet format for message reading/networking
                    665:        RFC             Request for Comments
                    666:        SMB             Synchronet Message Base
                    667:        UT              Universal Time (formerly called "Greenwhich Mean Time")
                    668: 
                    669: 
                    670: 
                    671: 
                    672: 
                    673: 
                    674: 
                    675: 
                    676: 
                    677: 
                    678: 
                    679: 
                    680: 
                    681: 
                    682: 
                    683: 
                    684: 
                    685: 
                    686: 
                    687: 
                    688: 
                    689: 
                    690: 
                    691: 
                    692: 
                    693: 
                    694: 
                    695: 
                    696: 
                    697: 
                    698: 
                    699: 
                    700: 
                    701: 
                    702: 
                    703:        _______________________________________________________________________________
                    704:        Synchronet                           12                  Definition of Acronyms
                    705: 
                    706: 
                    707:        Data types
                    708:        ==========
                    709:        
                    710:        uchar           Unsigned 8-bit value (0 through 255).
                    711:                        C example:
                    712:        
                    713:                        #define uchar unsigned char
                    714:        
                    715:        
                    716:        short           Signed 16-bit value (-32768 through 32767).
                    717:                        "short" is a C keyword indicating "short int".
                    718:        
                    719:        
                    720:        ushort          Unsigned 16-bit value (0 through 65535).
                    721:                        C example:
                    722:        
                    723:                        #define ushort unsigned short
                    724:        
                    725:        
                    726:        ulong           Unsigned 32-bit value (0 through 4294967295).
                    727:                        C example:
                    728:        
                    729:                        #define ulong unsigned long
                    730:        
                    731:        
                    732:        time_t          Unsigned 32-bit value.
                    733:                        Seconds since 00:00 Jan 01 1970 (Unix format).
                    734:                        Used for all time/date storage in SMB as part of the when_t
                    735:                        data type. This time format will support dates through the year
                    736:                        2105.
                    737:                        time_t is defined by ANSI C as a long (signed) which can
                    738:                        limit its date support to the year 2038 depending on the
                    739:                        library routines used.
                    740:        
                    741:        
                    742:        ASCII           String (aka character array) of 8-bit ASCII characters.
                    743:                        Characters with the bit 7 set (80h through FFh) represent
                    744:                        the IBM PC extended ASCII character set. When data or header
                    745:                        fields of this type are stored in the header, a NULL
                    746:                        terminator may or may not be present.
                    747:                        C example:
                    748:        
                    749:                        uchar str[80];
                    750:        
                    751:        
                    752:        ASCIIZ          ASCII string with (non-optional) NULL terminator.
                    753:                        C example:
                    754:        
                    755:                        uchar str[81];
                    756: 
                    757: 
                    758: 
                    759: 
                    760: 
                    761: 
                    762:        _______________________________________________________________________________
                    763:        Synchronet                           13                Definition of Data Types
                    764: 
                    765: 
                    766:        nulstr          ASCII string immediately terminated by NULL.
                    767:                        C example:
                    768:        
                    769:                        uchar *nulstr="";
                    770:        
                    771:        
                    772:        undef           Data buffer with undefined contents.
                    773:                        C example:
                    774:        
                    775:                        uchar buf[BUF_LEN];
                    776:        
                    777:        when_t          Date/Time stamp including time-zone adjustment information.
                    778:                        C example:
                    779:        
                    780:                        typedef struct {
                    781:        
                    782:                            time_t  time;   // Time stamp (in local time)
                    783:                            short   zone;   // Zone constant or Minutes (+/-) from UT
                    784:        
                    785:                            } when_t;
                    786:        
                    787:                        time:
                    788:        
                    789:                        A time value of 0 is invalid and indicates an uninitialized
                    790:                        time stamp.
                    791:        
                    792:                        Time stamps are always stored in universal time. i.e.
                    793:                        Regardless of what the local time zone is, Jan 1st 1994 00:00
                    794:                        will always be stored as 2D24BD00h.
                    795:        
                    796:                        zone:
                    797:        
                    798:                        If the zone is in the range -720 to +720, it represents the
                    799:                        number of minutes east or west of UT. Values in this range
                    800:                        should only be used for time zones not otherwise represented
                    801:                        here.
                    802:        
                    803:                        If the zone is greater than 720 or less than -720, then the
                    804:                        following bits have special meaning:
                    805:        
                    806:                        (1<<12)         // Non-US time zone     (east of UT)
                    807:                        (1<<13)         // Non-US time zone     (west of UT)
                    808:                        (1<<14)         // U.S. time zone
                    809:                        (1<<15)         // Daylight savings
                    810:        
                    811:                        The lower 12 bits (0 through 11) contain the number of minutes
                    812:                        east or west of UT (not accounting for daylight savings).
                    813: 
                    814: 
                    815: 
                    816: 
                    817: 
                    818: 
                    819: 
                    820: 
                    821:        _______________________________________________________________________________
                    822:        Synchronet                           14                Definition of Data Types
                    823: 
                    824: 
                    825:                        If the time zone is one specified in the U.S. Uniform Time Act,
                    826:                        the following values represent the zone:
                    827:        
                    828:                        AST 0x40F0      // Atlantic             (-04:00)
                    829:                        EST 0x412C      // Eastern              (-05:00)
                    830:                        CST 0x4168      // Central              (-06:00)
                    831:                        MST 0x41A4      // Mountain             (-07:00)
                    832:                        PST 0x41E0      // Pacific              (-08:00)
                    833:                        YST 0x421C      // Yukon                (-09:00)
                    834:                        HST 0x4258      // Hawaii/Alaska        (-10:00)
                    835:                        BST 0x4294      // Bering               (-11:00)
                    836:        
                    837:                        With bit 15 set, the following values represent the same zone
                    838:                        with the presence of daylight savings:
                    839:        
                    840:                        ADT 0xC0F0      // Atlantic             (-03:00)
                    841:                        EDT 0xC12C      // Eastern              (-04:00)
                    842:                        CDT 0xC168      // Central              (-05:00)
                    843:                        MDT 0xC1A4      // Mountain             (-06:00)
                    844:                        PDT 0xC1E0      // Pacific              (-07:00)
                    845:                        YDT 0xC21C      // Yukon                (-08:00)
                    846:                        HDT 0xC258      // Hawaii/Alaska        (-09:00)
                    847:                        BDT 0xC294      // Bering               (-10:00)
                    848:        
                    849:                        The following non-standard time zone specifications may also be
                    850:                        used:
                    851:        
                    852:                        MID 0x2294      // Midway               (-11:00)
                    853:                        VAN 0x21E0      // Vancouver            (-08:00)
                    854:                        EDM 0x21A4      // Edmonton             (-07:00)
                    855:                        WIN 0x2168      // Winnipeg             (-06:00)
                    856:                        BOG 0x212C      // Bogota               (-05:00)
                    857:                        CAR 0x20F0      // Caracas              (-04:00)
                    858:                        RIO 0x20B4      // Rio de Janeiro       (-03:00)
                    859:                        FER 0x2078      // Fernando de Noronha  (-02:00)
                    860:                        AZO 0x203C      // Azores               (-01:00)
                    861:                        LON 0x1000      // London               (+00:00)
                    862:                        BER 0x103C      // Berlin               (+01:00)
                    863:                        ATH 0x1078      // Athens               (+02:00)
                    864:                        MOS 0x10B4      // Moscow               (+03:00)
                    865:                        DUB 0x10F0      // Dubai                (+04:00)
                    866:                        KAB 0x110E      // Kabul                (+04:30)
                    867:                        KAR 0x112C      // Karachi              (+05:00)
                    868:                        BOM 0x114A      // Bombay               (+05:30)
                    869:                        KAT 0x1159      // Kathmandu            (+05:45)
                    870:                        DHA 0x1168      // Dhaka                (+06:00)
                    871:                        BAN 0x11A4      // Bangkok              (+07:00)
                    872:                        HON 0x11E0      // Hong Kong            (+08:00)
                    873:                        TOK 0x121C      // Tokyo                (+09:00)
                    874:                        SYD 0x1258      // Sydney               (+10:00)
                    875:                        NOU 0x1294      // Noumea               (+11:00)
                    876:                        WEL 0x12D0      // Wellington           (+12:00)
                    877: 
                    878: 
                    879: 
                    880:        _______________________________________________________________________________
                    881:        Synchronet                           15                Definition of Data Types
                    882: 
                    883: 
                    884:        fidoaddr_t      FidoNet address stored as four ushorts that represent the zone,
                    885:                        network, node, and point (in that order).
                    886:                        C example:
                    887:        
                    888:                        typedef struct {
                    889:        
                    890:                            ushort zone,
                    891:                                   net,
                    892:                                   node,
                    893:                                   point;
                    894:        
                    895:                            } fidoaddr_t;
                    896:        
                    897:        
                    898:        typestr_t       ASCIIZ string with ushort type prefix.
                    899:                        C example:
                    900:        
                    901:                        typedef struct {
                    902:        
                    903:                            ushort  type;   // Specifier for type of 'str'
                    904:                            uchar   str[];  // ASCIIZ filename or other string data
                    905:        
                    906:                            } typestr_t;
                    907:        
                    908:        
                    909:        mattach_t       File attachment information with type prefix, translation
                    910:                        string, and filename.
                    911:                        C example:
                    912:        
                    913:                        typedef struct {
                    914:        
                    915:                            ushort  type;   // Attachment type
                    916:                            ushort  xlat[]; // Translations of data in attachment
                    917:                            uchar   str[];  // ASCIIZ filename
                    918:        
                    919:                            } mattach_t;
                    920:        
                    921:        vattach_t       Video file attachment information with type, compression,
                    922:                        translation string, and filename.
                    923:                        C example:
                    924:        
                    925:                        typedef struct {
                    926:        
                    927:                            ushort  type;   // Attachment type
                    928:                            ushort  comp;   // Compression method
                    929:                            ushort  xlat[]; // Translations of data in attachment
                    930:                            uchar   str[];  // ASCIIZ filename
                    931:        
                    932:                            } vattach_t;
                    933: 
                    934: 
                    935: 
                    936: 
                    937: 
                    938: 
                    939:        _______________________________________________________________________________
                    940:        Synchronet                           16                Definition of Data Types
                    941: 
                    942: 
                    943:        mtext_t         Message text with translation string prefix.
                    944:                        C example:
                    945:        
                    946:                        typedef struct {
                    947:        
                    948:                            ushort  xlat[]; // Translations of text
                    949:                            uchar   text[]; // Actual text data
                    950:        
                    951:                            } mtext_t;
                    952:        
                    953:        
                    954:        ftext_t         Formatted message text with translation string prefix and
                    955:                        format type.
                    956:                        C example:
                    957:        
                    958:                        typedef struct {
                    959:        
                    960:                            ushort  type;   // See Image Types for valid types
                    961:                            ushort  xlat[]; // Translations of data
                    962:                            uchar   data[]; // Actual formatted text data
                    963:        
                    964:                            } ftext_t;
                    965:        
                    966:        
                    967:        membed_t        Embedded data with type prefix, translation string, and ASCIIZ
                    968:                        description.
                    969:                        C example:
                    970:        
                    971:                        typedef struct {
                    972:        
                    973:                            ushort  type;   // Specifier for type of 'dat'
                    974:                            ushort  xlat[]; // Translations of embedded data
                    975:                            uchar   name[]; // ASCIIZ char description of embedded data
                    976:                            uchar   dat[];  // Binary data
                    977:        
                    978:                            } membed_t;
                    979:        
                    980:        vembed_t        Embedded video data with type, compression method, translation
                    981:                        string, and ASCIIZ description.
                    982:                        C example:
                    983:        
                    984:                        typedef struct {
                    985:        
                    986:                            ushort  type;   // Specifier for type of 'dat'
                    987:                            ushort  comp;   // Compression method
                    988:                            ushort  xlat[]; // Translations of embedded data
                    989:                            uchar   name[]; // ASCIIZ char description of embedded data
                    990:                            uchar   dat[];  // Binary data
                    991:        
                    992:                            } vembed_t;
                    993: 
                    994: 
                    995: 
                    996: 
                    997: 
                    998:        _______________________________________________________________________________
                    999:        Synchronet                           17                Definition of Data Types
                   1000: 
                   1001: 
                   1002:        File formats
                   1003:        ============
                   1004:        
                   1005:        Index File (*.SID)
                   1006:        ------------------
                   1007:        The index file for each message base contains one record per message in the
                   1008:        base. Each record is fixed length using the following format:
                   1009:        
                   1010:        Index Record:
                   1011:        ------------
                   1012:        C example:
                   1013:        
                   1014:        typedef struct {
                   1015:        
                   1016:            ushort  to;     // 16-bit CRC of recipient name (lower case) or user number
                   1017:            ushort  from;   // 16-bit CRC of sender name (lower case) or user number
                   1018:            ushort  subj;   // 16-bit CRC of title/subject (lower case)
                   1019:            ushort  attr;   // attributes (MSG_PRIVATE, MSG_READ, etc. flags)
                   1020:            ulong   offset; // byte offset of message header in header file
                   1021:            ulong   number; // message serial number (1 based)
                   1022:            time_t  time;   // import date/time stamp (Unix format)
                   1023:        
                   1024:            } idxrec_t;
                   1025:        
                   1026:        
                   1027:        Example file dump (16 messages starting with message number 15):
                   1028:        ---------------------------------------------------------------
                   1029:        000000    36 4F 13 07 2A 77 00 00   20 00 00 00 0F 00 00 00    6O..*w.. .......
                   1030:        000010    BE 62 76 2C 36 4F 46 0A   7F B2 00 00 20 01 00 00    �bv,6OF.�.. ...
                   1031:        000020    10 00 00 00 C7 29 78 2C   36 4F 70 6F 46 FF 00 00    ....�)x,6OpoF�..
                   1032:        000030    20 02 00 00 11 00 00 00   AD D3 7A 2C 70 6F 13 07     .......��z,po..
                   1033:        000040    46 FF 00 00 20 03 00 00   12 00 00 00 D6 F8 7F 2C    F�.. .......��,
                   1034:        000050    36 4F E1 EA E7 E9 00 00   20 04 00 00 13 00 00 00    6O����.. .......
                   1035:        000060    1E 7B 85 2C 37 0D 2E DF   4D 79 00 00 20 05 00 00    .{�,7..�My.. ...
                   1036:        000070    14 00 00 00 5C E1 A1 2C   90 54 2D 5A 86 62 00 00    ....\�,�T-Z�b..
                   1037:        000080    20 06 00 00 15 00 00 00   39 2E A2 2C 70 6F 1A 8B     .......9.�,po.�
                   1038:        000090    46 FF 00 00 20 07 00 00   16 00 00 00 D0 7B A8 2C    F�.. .......�{�,
                   1039:        0000A0    2E DF 1A 8B 4D 79 00 00   20 08 00 00 17 00 00 00    .�.�My.. .......
                   1040:        0000B0    FF 7B A8 2C B4 D9 35 7C   23 B1 00 00 20 09 00 00    �{�,��5|#�.. ...
                   1041:        0000C0    18 00 00 00 CE D4 BA 2C   36 4F BC D8 B2 E7 00 00    ....�Ժ,6O�ز�..
                   1042:        0000D0    20 0A 00 00 19 00 00 00   14 5F C3 2C BA A8 4E B0     ........_�,��N�
                   1043:        0000E0    67 76 00 00 20 0B 00 00   1A 00 00 00 6F 89 C3 2C    gv.. .......o��,
                   1044:        0000F0    36 4F 0C 01 19 9C 00 00   20 0C 00 00 1B 00 00 00    6O...�.. .......
                   1045:        000100    F8 30 C6 2C 36 4F FA 48   0E 55 00 00 20 0D 00 00    �0�,6O�H.U.. ...
                   1046:        000110    1C 00 00 00 6A 94 D3 2C   36 4F F1 CE CF A2 00 00    ....j��,6O��Ϣ..
                   1047:        000120    20 0E 00 00 1D 00 00 00   53 DB D5 2C 8D A6 21 CE     .......S��,��!�
                   1048:        000130    F7 AB 00 00 20 0F 00 00   1E 00 00 00 31 29 DC 2C    ��.. .......1)�,
                   1049:        
                   1050: 
                   1051: 
                   1052: 
                   1053: 
                   1054: 
                   1055: 
                   1056: 
                   1057:        _______________________________________________________________________________
                   1058:        Synchronet                           18               Index (*.SID) File Format
                   1059: 
                   1060: 
                   1061:        Field descriptions:
                   1062:        ------------------
                   1063:        To:
                   1064:        The 'To' field is the CRC-16 of the name of the intended recipient agent of
                   1065:        this message or the intended recipient's user number. If the CRC is stored, the
                   1066:        text must be converted to lower case (A-Z changed to a-z) before the CRC is
                   1067:        calculated. If the message is forwarded to another agent, the original or new
                   1068:        index record must be changed to contain the CRC-16 of the new recipient name or
                   1069:        user number. This field must always contain the recipient user number for local
                   1070:        e-mail on a Synchronet BBS. Outbound netmail stored in the Synchronet local
                   1071:        e-mail message base will contain 0 in this field.
                   1072:        
                   1073:        From:
                   1074:        This field, similar to the 'To' field, contains the CRC-16 of the name of the
                   1075:        sending agent of this message or the sender's user number. If the CRC is
                   1076:        stored, the text must be converted to lower case (A-Z changed to a-z) before
                   1077:        the CRC is calculated. If the message is forwarded to another agent, the
                   1078:        original or new index record must be changed to contain the CRC-16 of the new
                   1079:        sender name or user number. If the message was imported into the local e-mail
                   1080:        message base on a Synchronet BBS via netmail, this field will contain 0.
                   1081:        
                   1082:        Subj:
                   1083:        The 'Subj' field contains the CRC-16 of the message's subject. The subject
                   1084:        must be converted to lower case (A-Z changed to a-z) and all preceeding
                   1085:        "re: "'s and "re:"'s removed before calculating the CRC-16.
                   1086:        
                   1087:        Attr:
                   1088:        This ushort is a bit field of the specific attributes for this message.
                   1089:        It is a clone of the 'attr' element of the msghdr_t structure.
                   1090:        
                   1091:        Offset:
                   1092:        This ulong is the offset (in bytes) in the header file for this message's
                   1093:        header record.
                   1094:        
                   1095:        Number:
                   1096:        This ulong is the serial number of this message. Valid values are 1 through
                   1097:        0xffffffff. No two index records in the same message base may have the same
                   1098:        message number. All index records must have sequential, but not necessarily
                   1099:        consequetive, message numbers.
                   1100:        
                   1101:        Time:
                   1102:        This field is the date/time stamp the message was imported to or posted in
                   1103:        the message base. It is a clone of the 'when_imported.time' element of the
                   1104:        msghdr_t structure.
                   1105: 
                   1106: 
                   1107: 
                   1108: 
                   1109: 
                   1110: 
                   1111: 
                   1112: 
                   1113: 
                   1114: 
                   1115: 
                   1116:        _______________________________________________________________________________
                   1117:        Synchronet                           19               Index (*.SID) File Format
                   1118: 
                   1119: 
                   1120:        Header File (*.SHD)
                   1121:        ===================
                   1122:        
                   1123:        Each SMB header file is made up of two distinct sections: base header records
                   1124:        and message header records (usually the bulk of the file).
                   1125:        
                   1126:        Base Header Records:
                   1127:        -------------------
                   1128:        Base header records are blocks of data that apply to the entire message base
                   1129:        and are of variable length. This specification defines only one base header
                   1130:        record, the "Status info" (smbstatus_t) record. This status info record must be
                   1131:        the first base header record in the file and must be modified if additional
                   1132:        base header records are added.
                   1133:        
                   1134:        Additional header records allow other developers to store configuration and
                   1135:        status information particular to their application needs. It also allows for
                   1136:        future header record definitions as part of this specification without causing
                   1137:        backward compatibility issues.
                   1138:        
                   1139:        Each base header record contains a fixed length portion (smbhdr_t) and an
                   1140:        optional variable length portion.
                   1141:        
                   1142:        Whenever a base header record is read or updated (written), it must first
                   1143:        be successfully locked and subsequently unlocked.
                   1144:        
                   1145:        The first base header record (Status Info) is used as a semaphore when writing
                   1146:        to the message index (.SID) file and, when using the Hyper Allocation storage
                   1147:        method, writing to the message data (.SDT) file. This record must be
                   1148:        succesfully locked before writing and subsequently unlocked. This is to insure
                   1149:        that multiple applications simultaneously writing to the same message base
                   1150:        does result in corrrupted data.
                   1151:        
                   1152:        
                   1153:        Message Header Records:
                   1154:        ----------------------
                   1155:        Following the last base header record is the first message header record. Each
                   1156:        header record is stored in one or more 256 byte blocks. There must be exactly
                   1157:        one active message header record for every index record in the index file.
                   1158:        (Note: This does not include deleted message headers that have not been
                   1159:        overwritten by a new message header).
                   1160:        
                   1161:        Each message header record contains a fixed length portion (msghdr_t), a list
                   1162:        of zero or more fixed length data fields (dfield_t), and a list of three or
                   1163:        more variable length header fields (hfield_t).
                   1164:        
                   1165:        The value of the data stored in the zero or more unused bytes of the last
                   1166:        header record block have an undefined value, though whenever possible
                   1167:        developers should initialize to binary zero for human readability.
                   1168:        
                   1169:        Whenever a message header record is read or updated (written), it must first
                   1170:        be successfully locked and subsequently unlocked.
                   1171: 
                   1172: 
                   1173: 
                   1174: 
                   1175:        _______________________________________________________________________________
                   1176:        Synchronet                           20              Header File (*.SHD) Format
                   1177: 
                   1178: 
                   1179:        Base Header Record (Fixed Portion):
                   1180:        ----------------------------------
                   1181:        C example:
                   1182:        
                   1183:        typedef struct {
                   1184:        
                   1185:            uchar   id[4];          // text or binary unique hdr ID
                   1186:            ushort  version;        // version number (initially 100h for 1.00)
                   1187:            ushort  length;         // length including this struct
                   1188:        
                   1189:            } smbhdr_t;
                   1190:        
                   1191:        
                   1192:        Base Header Record Field Descriptions:
                   1193:        -------------------------------------
                   1194:        Id:
                   1195:        This is a four byte unique ID identifying the type of the base header record.
                   1196:        The bytes may contain any value, but printable ASCII characters are preferred.
                   1197:        The only ID defined in this specification is "SMB^Z" used by the Status Info
                   1198:        base header record.
                   1199:        
                   1200:        Version:
                   1201:        This is a version number of the base header record type. Base header records
                   1202:        of different versions may have different formats or contain different
                   1203:        information. This is to aid the application in determining if the record
                   1204:        is pertinent and if so, to what degree. The Status Info base header record
                   1205:        uses this version field to define the version of the format for the entire
                   1206:        message base (currently 0x121 for version 1.21).
                   1207:        
                   1208:        Length:
                   1209:        This is entire length in bytes of this header record (including both fixed
                   1210:        and variable portions).
                   1211:        
                   1212:        
                   1213:        Base Header #1 (Status info) Record (Variable Portion):
                   1214:        ------------------------------------------------------
                   1215:        C example:
                   1216:        
                   1217:        typedef struct {
                   1218:        
                   1219:            ulong   last_msg;       // last message number posted or imported
                   1220:            ulong   total_msgs;     // total messages currently in message base
                   1221:            ulong   header_offset;  // byte offset to first header record
                   1222:            ulong   max_crcs;       // Maximum number of CRCs to keep in history
                   1223:            ulong   max_msgs;       // Maximum number of messages to keep in base
                   1224:            ushort  max_age;        // Maximum age of messages (days) to keep in base
                   1225:            ushort  attr;           // Attribute bits
                   1226:        
                   1227:            } smbstatus_t;
                   1228: 
                   1229: 
                   1230: 
                   1231: 
                   1232: 
                   1233: 
                   1234:        _______________________________________________________________________________
                   1235:        Synchronet                           21              Header File (*.SHD) Format
                   1236: 
                   1237: 
                   1238:        Base Header #1 (Status Info) Record (Variable Portion) Field Descriptions:
                   1239:        -------------------------------------------------------------------------
                   1240:        Last_msg:
                   1241:        This is the serial number of the last message imported or posted into this
                   1242:        message base. The index, header, and data records for this message may possibly
                   1243:        not exist (due to deletion). This field is used for determining the message
                   1244:        number to give to a new message being imported or posted into this message
                   1245:        base. This field must be updated for every message added to the message base.
                   1246:        
                   1247:        Total_msgs:
                   1248:        This is the total number of active messages currently in the message base.
                   1249:        This number should match the number of records in the index (.SID) file
                   1250:        and active header records in the header (.SHD) file. This field must be
                   1251:        updated whenever a message is added to or removed from the message base.
                   1252:        
                   1253:        Header_offset:
                   1254:        This is the byte offset to the first message header record. It is useful
                   1255:        for skipping all the base header records and going directly to the first
                   1256:        message header record.
                   1257:        
                   1258:        Max_crcs:
                   1259:        This is the maximum number of message CRCs to store in the CRC history (.SCH)
                   1260:        file for duplicate message checking. If this field contains 0, then duplicate
                   1261:        message checking is disabled.
                   1262:        
                   1263:        Max_msgs:
                   1264:        This is the preferred maximum number of messages to keep in this message
                   1265:        base as specified by the system operator. It is used by maintenance programs
                   1266:        that trim the message base down by removing old messages. This field should
                   1267:        be ignored by applications importing or posting messages allowing them to
                   1268:        exceed this maximum at will.
                   1269:        
                   1270:        Max_age:
                   1271:        This field is the maximum age (in days) of messages to keep in the message
                   1272:        base. It is used by maintenance programs to purge out-dated messages from
                   1273:        the message base.
                   1274: 
                   1275: 
                   1276: 
                   1277: 
                   1278: 
                   1279: 
                   1280: 
                   1281: 
                   1282: 
                   1283: 
                   1284: 
                   1285: 
                   1286: 
                   1287: 
                   1288: 
                   1289: 
                   1290: 
                   1291: 
                   1292: 
                   1293:        _______________________________________________________________________________
                   1294:        Synchronet                           22              Header File (*.SHD) Format
                   1295: 
                   1296: 
                   1297:        Attr:
                   1298:        This is a bit field containing specific attributes (or flags) that may define
                   1299:        the way messages are stored or retrieved from the this message base. The
                   1300:        following attributes are defined:
                   1301:        
                   1302:            SMB_EMAIL       (1<<0)
                   1303:        
                   1304:            Indicates the message base is specifically for messages to or from local
                   1305:            users. When this bit is set, the idxrec.to and idxrec.from fields will
                   1306:            contain the user numbers (or 0 for non-user destination/source) instead of
                   1307:            the CRC-16 of the agent name.
                   1308:        
                   1309:            SMB_HYPERALLOC  (1<<1)
                   1310:        
                   1311:            Indicates the message base uses the Hyper Allocation storage method. This
                   1312:            bit should not be cleared by an application without first deleting all the
                   1313:            messages in the message base. This is due to the fact the Hyper Allocation
                   1314:            is not downward compatible with the Self-packing and Fast Allocation
                   1315:            storage methods.
                   1316:        
                   1317:        When used with Synchronet BBS software, a message base must NOT have both of
                   1318:        the above attributes set. The only message base that should have the SMB_EMAIL
                   1319:        attribute set is the DATA\MAIL message base.
                   1320:        
                   1321: 
                   1322: 
                   1323: 
                   1324: 
                   1325: 
                   1326: 
                   1327: 
                   1328: 
                   1329: 
                   1330: 
                   1331: 
                   1332: 
                   1333: 
                   1334: 
                   1335: 
                   1336: 
                   1337: 
                   1338: 
                   1339: 
                   1340: 
                   1341: 
                   1342: 
                   1343: 
                   1344: 
                   1345: 
                   1346: 
                   1347: 
                   1348: 
                   1349: 
                   1350: 
                   1351: 
                   1352:        _______________________________________________________________________________
                   1353:        Synchronet                           23              Header File (*.SHD) Format
                   1354: 
                   1355: 
                   1356:        Base Header #1 (Status info) Record Contents:
                   1357:        --------------------------------------------
                   1358:        smbhdr.id="SMB\x1a";        // SMB^Z
                   1359:        smbhdr.version=0x121;       // v1.21
                   1360:        smbhdr.length=sizeof(smbhdr_t)+sizeof(smbstatus_t); smbstatus_t status;
                   1361:        
                   1362:        
                   1363:        Additional Base Headers:
                   1364:        -----------------------
                   1365:        Additional headers from developers must have initial 8 bytes in smbhdr_t
                   1366:        format, length must include size of smbhdr_t, and header_offset of smbstatus_t
                   1367:        must be changed to include the size of the additional header(s).
                   1368:        
                   1369:        
                   1370:        Example file dump (base header portion only):
                   1371:        --------------------------------------------
                   1372:        000000    53 4D 42 1A 20 01 20 00   F4 01 00 00 F4 01 00 00    SMB. . .�...�...
                   1373:        000010    20 00 00 00 D0 07 00 00   D0 07 00 00 00 00 00 00     ...�...�.......
                   1374:        
                   1375: 
                   1376: 
                   1377: 
                   1378: 
                   1379: 
                   1380: 
                   1381: 
                   1382: 
                   1383: 
                   1384: 
                   1385: 
                   1386: 
                   1387: 
                   1388: 
                   1389: 
                   1390: 
                   1391: 
                   1392: 
                   1393: 
                   1394: 
                   1395: 
                   1396: 
                   1397: 
                   1398: 
                   1399: 
                   1400: 
                   1401: 
                   1402: 
                   1403: 
                   1404: 
                   1405: 
                   1406: 
                   1407: 
                   1408: 
                   1409: 
                   1410: 
                   1411:        _______________________________________________________________________________
                   1412:        Synchronet                           24              Header File (*.SHD) Format
                   1413: 
                   1414: 
                   1415:        Message Header Record (Fixed portion):
                   1416:        -------------------------------------
                   1417:        C example:
                   1418:        
                   1419:        typedef struct {
                   1420:        
                   1421:            uchar   id[4];          // SHD^Z (same for all types and versions)
                   1422:            ushort  type;           // Message type (this is the definition of type 0)
                   1423:            ushort  version;        // Version of type (initially 100h for 1.00)
                   1424:            ushort  length;         // Total length of fixed portion + all fields
                   1425:            ushort  attr;           // Attributes (bit field) (duplicated in SID)
                   1426:            ulong   auxattr;        // Auxillary attributes (bit field)
                   1427:            ulong   netattr;        // Network attributes (bit field)
                   1428:            when_t  when_written;   // Date/Time message was originally created
                   1429:            when_t  when_imported;  // Date/Time message was imported (locally)
                   1430:            ulong   number;         // Message number (unique, not necessarily seq.)
                   1431:            ulong   thread_orig;    // Original message number in thread
                   1432:            ulong   thread_next;    // Next message in thread
                   1433:            ulong   thread_first;   // Number of first reply to this message
                   1434:            uchar   reserved[16];   // 16 reserved bytes for future use
                   1435:            ulong   offset;         // Offset for buffer into data file (0 or mod 256)
                   1436:            ushort  total_dfields;  // Total number of data fields
                   1437:        
                   1438:            } msghdr_t;
                   1439:        
                   1440:        typedef struct {
                   1441:        
                   1442:            ushort  type;           // See "Data Field Types" values
                   1443:            ulong   offset;         // Offset into buffer 
                   1444:            ulong   length;         // Length of data field in buffer
                   1445:        
                   1446:            } dfield_t;
                   1447:        
                   1448:        typedef struct {
                   1449:        
                   1450:            ushort  type;           // See "Header Field Types" for values
                   1451:            ushort  length;         // Length of buffer
                   1452:            uchar   dat[length];
                   1453:        
                   1454:            } hfield_t;
                   1455: 
                   1456: 
                   1457: 
                   1458: 
                   1459: 
                   1460: 
                   1461: 
                   1462: 
                   1463: 
                   1464: 
                   1465: 
                   1466: 
                   1467: 
                   1468: 
                   1469: 
                   1470:        _______________________________________________________________________________
                   1471:        Synchronet                           25              Header File (*.SHD) Format
                   1472: 
                   1473: 
                   1474:        Example file dump (one header record, both fixed and variable length portions):
                   1475:        ------------------------------------------------------------------------------
                   1476:        000020    53 48 44 1A 00 00 20 01   F5 00 00 00 00 00 00 00    SHD... .�.......
                   1477:        000030    00 00 00 00 46 DB F7 2C   00 00 7D D7 29 2D 00 00    ....F��,..}�)-..
                   1478:        000040    01 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00    ................
                   1479:        000050    00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00    ................
                   1480:        000060    00 00 00 00 02 00 00 00   00 00 00 00 4A 01 00 00    ............J...
                   1481:        000070    02 00 4A 01 00 00 53 00   00 00 00 00 13 00 4D 61    ..J...S.......Ma
                   1482:        000080    72 69 61 6E 6E 65 20 4D   6F 6E 74 67 6F 6D 65 72    rianne Montgomer
                   1483:        000090    79 30 00 0C 00 43 61 72   6F 6C 20 47 61 69 73 65    y0...Carol Gaise
                   1484:        0000A0    72 60 00 07 00 46 61 72   6E 68 61 6D A4 00 14 00    r`...Farnham�...
                   1485:        0000B0    31 3A 31 33 38 2F 31 30   32 2E 30 20 32 63 66 38    1:138/102.0 2cf8
                   1486:        0000C0    30 35 37 36 A5 00 14 00   31 3A 33 34 33 2F 31 30    0576�...1:343/10
                   1487:        0000D0    30 2E 30 20 32 63 66 33   62 39 30 61 A3 00 23 00    0.0 2cf3b90a�.#.
                   1488:        0000E0    31 33 38 2F 31 30 32 20   31 20 32 37 30 2F 31 30    138/102 1 270/10
                   1489:        0000F0    31 20 32 30 39 2F 32 30   39 20 31 30 33 2F 30 20    1 209/209 103/0 
                   1490:        000100    33 35 35 02 00 02 00 02   00 03 00 08 00 01 00 8A    355............�
                   1491:        000110    00 66 00 00 00 00 00 00   00 00 00 00 00 00 00 00    .f..............
                   1492: 
                   1493: 
                   1494: 
                   1495: 
                   1496: 
                   1497: 
                   1498: 
                   1499: 
                   1500: 
                   1501: 
                   1502: 
                   1503: 
                   1504: 
                   1505: 
                   1506: 
                   1507: 
                   1508: 
                   1509: 
                   1510: 
                   1511: 
                   1512: 
                   1513: 
                   1514: 
                   1515: 
                   1516: 
                   1517: 
                   1518: 
                   1519: 
                   1520: 
                   1521: 
                   1522: 
                   1523: 
                   1524: 
                   1525: 
                   1526: 
                   1527: 
                   1528: 
                   1529:        _______________________________________________________________________________
                   1530:        Synchronet                           26              Header File (*.SHD) Format
                   1531: 
                   1532: 
                   1533:        Contents of example header:
                   1534:        --------------------------
                   1535:        id                   SHD^Z
                   1536:        type                 0000h
                   1537:        version              0120h
                   1538:        length               245
                   1539:        attr                 0000h
                   1540:        auxattr              00000000h
                   1541:        netattr              00000000h
                   1542:        when_written         Sat Nov 27 17:57:10 1993
                   1543:        when_imported        Tue Jan 04 15:54:21 1994
                   1544:        number               1
                   1545:        thread_orig          0
                   1546:        thread_next          0
                   1547:        thread_first         0
                   1548:        reserved[16]         
                   1549:        offset               0
                   1550:        total_dfields        2
                   1551:        
                   1552:        dfield[0].type       00h
                   1553:        dfield[0].offset     0
                   1554:        dfield[0].length     330
                   1555:        dfield[1].type       02h
                   1556:        dfield[1].offset     330
                   1557:        dfield[1].length     83
                   1558:        
                   1559:        hfield[0].type       00h
                   1560:        hfield[0].length     19
                   1561:        hfield[0]_dat        Marianne Montgomery
                   1562:        hfield[1].type       30h
                   1563:        hfield[1].length     12
                   1564:        hfield[1]_dat        Carol Gaiser
                   1565:        hfield[2].type       60h
                   1566:        hfield[2].length     7
                   1567:        hfield[2]_dat        Farnham
                   1568:        hfield[3].type       A4h
                   1569:        hfield[3].length     20
                   1570:        hfield[3]_dat        1:138/102.0 2cf80576
                   1571:        hfield[4].type       A5h
                   1572:        hfield[4].length     20
                   1573:        hfield[4]_dat        1:343/100.0 2cf3b90a
                   1574:        hfield[5].type       A3h
                   1575:        hfield[5].length     35
                   1576:        hfield[5]_dat        138/102 1 270/101 209/209 103/0 355
                   1577:        hfield[6].type       02h
                   1578:        hfield[6].length     2
                   1579:        hfield[6]_dat        02 00
                   1580:        hfield[7].type       03h
                   1581:        hfield[7].length     8
                   1582:        hfield[7]_dat        01 00 8A 00 66 00 00 00
                   1583: 
                   1584: 
                   1585: 
                   1586: 
                   1587: 
                   1588:        _______________________________________________________________________________
                   1589:        Synchronet                           27              Header File (*.SHD) Format
                   1590: 
                   1591: 
                   1592:        Fixed Portion Field descriptions:
                   1593:        --------------------------------
                   1594:        Id:
                   1595:        This field (regardless of the header type or version) must always contain the
                   1596:        the string "SHD^Z". This is to aid in the restoration of a corrupted header
                   1597:        file and give a visual indication of the beginning of a new header record when
                   1598:        viewing dumps of the header file.
                   1599:        
                   1600:        Type:
                   1601:        This is the message header type. Only one type is currently defined by this
                   1602:        specification (type 0). Any and all future header types will have the first
                   1603:        4 fields (10 bytes) in the same format of type 0. This allows other types
                   1604:        (with different lengths) to be skipped because the 4th field (length) will
                   1605:        always be in the same position.
                   1606:        
                   1607:        Version:
                   1608:        This is the version of this header type. This specification defines version
                   1609:        1.21 of message header type 0 (stored as 121h).
                   1610:        
                   1611:        Length:
                   1612:        This is the total length of this message header record (including both fixed
                   1613:        and variable length portions, but NOT including unused block space).
                   1614:        
                   1615:        Attr:
                   1616:        This is a bit field (16-bit) containing basic message attributes (flags) for
                   1617:        this message. An exact duplicate of this field is stored in the index file as
                   1618:        well. They must always match.
                   1619:        
                   1620:        Auxattr:
                   1621:        This is a bit field (32-bit) containing the auxillary attributes (flags) for
                   1622:        this message. The attributes stored in this variable are more specific in
                   1623:        nature and less critical than those in the Attr field.
                   1624:        
                   1625:        Netattr:
                   1626:        This is a bit field (32-bit) containing the network attributes (flags) for this
                   1627:        message. The attributes stored in this variable are related solely to message
                   1628:        networking.
                   1629:        
                   1630:        When_written:
                   1631:        This is the date and time when the message was originally created.
                   1632:        
                   1633:        When_imported:
                   1634:        This is the date and time when the message was posted on or imported into the
                   1635:        local message system.
                   1636:        
                   1637:        Number:
                   1638:        This is the message's unique serial number (from 1 to FFFFFFFFh). This field
                   1639:        is duplicated in the index file. They must always match.
                   1640: 
                   1641: 
                   1642: 
                   1643: 
                   1644: 
                   1645: 
                   1646: 
                   1647:        _______________________________________________________________________________
                   1648:        Synchronet                           28              Header File (*.SHD) Format
                   1649: 
                   1650: 
                   1651:        Thread_orig:
                   1652:        If this message is a reply, then this field contains the number of the original
                   1653:        message that was replied to. If this message was not a reply, this field will
                   1654:        contain the value 0.
                   1655:        
                   1656:        Thread_next:
                   1657:        If this message is a reply, and there are later replies to that message
                   1658:        (the message number contained in the Thread_orig field), then this field will
                   1659:        contain the number of the next reply in the chain. If this message is the only
                   1660:        reply to the orignal message, this field will contain the value 0.
                   1661:        
                   1662:        Thread_first:
                   1663:        If there are any replies to this message (after it has been posted), this field
                   1664:        will contain the number of the first reply to this message. If there are no
                   1665:        replies to this message, this field will contain the value 0.
                   1666:        
                   1667:        Reserved:
                   1668:        Unused bytes, reserved for future definition in the message header type 0
                   1669:        specification.
                   1670:        
                   1671:        Offset:
                   1672:        The byte offset into the data file, specifying the start of the buffer for
                   1673:        all data associated with this message. This value must be either 0 or modula
                   1674:        256. When retrieving the actual data portion of data fields, the physical
                   1675:        offset into the file will be the offset of the message data buffer (this field)
                   1676:        plus the offset of the individual data field (msghdr_t.offset+dfield_t.offset).
                   1677:        
                   1678:        Total_dfields:
                   1679:        This field contains the total number of data fields associated with this
                   1680:        message. The value of this field must match the actual number of data fields
                   1681:        stored in the header (dfield_t data types following the fixed portion of the
                   1682:        message header).
                   1683:        
                   1684:        
                   1685:        Variable Portion Field descriptions:
                   1686:        -----------------------------------
                   1687:        See the Header Field Type and Data Field Type sections for the descriptions
                   1688:        of the values contained in these fields.
                   1689: 
                   1690: 
                   1691: 
                   1692: 
                   1693: 
                   1694: 
                   1695: 
                   1696: 
                   1697: 
                   1698: 
                   1699: 
                   1700: 
                   1701: 
                   1702: 
                   1703: 
                   1704: 
                   1705: 
                   1706:        _______________________________________________________________________________
                   1707:        Synchronet                           29              Header File (*.SHD) Format
                   1708: 
                   1709: 
                   1710:        Message Header Block Allocation (*.SHA)
                   1711:        =======================================
                   1712:        
                   1713:        If this message base uses the Hyper Allocation storage method (the
                   1714:        SMB_HYPERALLOC bit is set in the smbstatus_t.attr field), then this file is
                   1715:        not created or used.
                   1716:        
                   1717:        This file contains no header or signature data. Each byte (uchar) in the file
                   1718:        specifies the allocation state of the corresponding 256 byte block in the
                   1719:        header (*.SHD) file. A value of 0 indicates a free header block, and a value of
                   1720:        1 indicates an allocated block. Other non-zero values are undefined.
                   1721:        
                   1722:        This file must always be opened DENY ALL (non-shareable).
                   1723: 
                   1724: 
                   1725: 
                   1726: 
                   1727: 
                   1728: 
                   1729: 
                   1730: 
                   1731: 
                   1732: 
                   1733: 
                   1734: 
                   1735: 
                   1736: 
                   1737: 
                   1738: 
                   1739: 
                   1740: 
                   1741: 
                   1742: 
                   1743: 
                   1744: 
                   1745: 
                   1746: 
                   1747: 
                   1748: 
                   1749: 
                   1750: 
                   1751: 
                   1752: 
                   1753: 
                   1754: 
                   1755: 
                   1756: 
                   1757: 
                   1758: 
                   1759: 
                   1760: 
                   1761: 
                   1762: 
                   1763: 
                   1764: 
                   1765:        _______________________________________________________________________________
                   1766:        Synchronet                           30   Header Allocation File (*.SHA) Format
                   1767: 
                   1768: 
                   1769:        Message Data (*.SDT)
                   1770:        ====================
                   1771:        
                   1772:        This file contains no header or signature data. It contains the text and other
                   1773:        embedded data for the messages in a single message base. The data for each
                   1774:        message always begins on a 256 byte block boundary. The data in the unused
                   1775:        portion of a data block is undefined, but should be initialized to NULL
                   1776:        whenever possible.
                   1777:        
                   1778:        This file must always be opened DENY NONE (shareable).
                   1779:        
                   1780:        Data fields of type TEXT_BODY and TEXT_TAIL must have all trailing white space
                   1781:        and control characters removed (i.e. the last character of the data record
                   1782:        must be in the range 21h to FFh). The only exception to this rule, is if the
                   1783:        TEXT_BODY is terminated with multiple contiguous CRLFs, only the last CRLF
                   1784:        should be removed. A CRLF should always be appended to the text data when it is
                   1785:        displayed.
                   1786:        
                   1787:        When reading from this file, it is a good idea to make sure the message header
                   1788:        for the data being read is currently locked (though no single message header
                   1789:        should be locked for extended durations of time). This will insure that no
                   1790:        other application will write to this portion of the file while it's being
                   1791:        read (read from disk, not displayed).
                   1792:        
                   1793:        When using the Hyper Allocation storage method, the Status Info message base
                   1794:        header must be successfully locked before writing to this file and subsequently
                   1795:        unlocked.
                   1796: 
                   1797: 
                   1798: 
                   1799: 
                   1800: 
                   1801: 
                   1802: 
                   1803: 
                   1804: 
                   1805: 
                   1806: 
                   1807: 
                   1808: 
                   1809: 
                   1810: 
                   1811: 
                   1812: 
                   1813: 
                   1814: 
                   1815: 
                   1816: 
                   1817: 
                   1818: 
                   1819: 
                   1820: 
                   1821: 
                   1822: 
                   1823: 
                   1824:        _______________________________________________________________________________
                   1825:        Synchronet                           31                Data File (*.SDT) Format
                   1826: 
                   1827: 
                   1828:        Message Data Block Allocation (*.SDA)
                   1829:        =====================================
                   1830:        
                   1831:        If this message base uses the Hyper Allocation storage method (the
                   1832:        SMB_HYPERALLOC bit is set in the smbstatus_t.attr field), then this file is
                   1833:        not created or used.
                   1834:        
                   1835:        This file contains no header or signature data. Each word (ushort) in the file
                   1836:        specifies the allocation state of the corresponding 256 byte block in the data
                   1837:        (*.SDT) file. A value of 0 indicates a free block, and a non-zero value
                   1838:        indicates the number of message header records associated with this message
                   1839:        data (most often 1). Each block can be used by up to 65,535 header records.
                   1840:        
                   1841:        This file must always be opened DENY ALL (non-shareable).
                   1842: 
                   1843: 
                   1844: 
                   1845: 
                   1846: 
                   1847: 
                   1848: 
                   1849: 
                   1850: 
                   1851: 
                   1852: 
                   1853: 
                   1854: 
                   1855: 
                   1856: 
                   1857: 
                   1858: 
                   1859: 
                   1860: 
                   1861: 
                   1862: 
                   1863: 
                   1864: 
                   1865: 
                   1866: 
                   1867: 
                   1868: 
                   1869: 
                   1870: 
                   1871: 
                   1872: 
                   1873: 
                   1874: 
                   1875: 
                   1876: 
                   1877: 
                   1878: 
                   1879: 
                   1880: 
                   1881: 
                   1882: 
                   1883:        _______________________________________________________________________________
                   1884:        Synchronet                           32     Data Allocation File (*.SDA) Format
                   1885: 
                   1886: 
                   1887:        CRC history for duplicate message checking (*.SCH)
                   1888:        ==================================================
                   1889:        
                   1890:        This file is optional and contains no header or signature data. Each long word
                   1891:        (ulong) in the file contains a CRC-32 of previously posted/imported messages.
                   1892:        These CRCs can be used to check a candidate message for posting/import to be
                   1893:        sure the message isn't a duplicate created by human or program error. The
                   1894:        maximum number of CRCs to store is defined in the first message base header
                   1895:        record (smbstatus_t.max_crcs).
                   1896:        
                   1897:        The CRC is calculated on the first TEXT_BODY data field before any translations
                   1898:        are applied (e.g. encoding, compression, encryption).
                   1899:        
                   1900:        This file must always be opened DENY ALL (non-shareable).
                   1901: 
                   1902: 
                   1903: 
                   1904: 
                   1905: 
                   1906: 
                   1907: 
                   1908: 
                   1909: 
                   1910: 
                   1911: 
                   1912: 
                   1913: 
                   1914: 
                   1915: 
                   1916: 
                   1917: 
                   1918: 
                   1919: 
                   1920: 
                   1921: 
                   1922: 
                   1923: 
                   1924: 
                   1925: 
                   1926: 
                   1927: 
                   1928: 
                   1929: 
                   1930: 
                   1931: 
                   1932: 
                   1933: 
                   1934: 
                   1935: 
                   1936: 
                   1937: 
                   1938: 
                   1939: 
                   1940: 
                   1941: 
                   1942:        _______________________________________________________________________________
                   1943:        Synchronet                           33         CRC History File (*.SCH) Format
                   1944: 
                   1945: 
                   1946:        Header Field Types:
                   1947:        ==================
                   1948:        
                   1949:        These are the defined valid values for hfield_t.type:
                   1950:        
                   1951:        Name     : SENDER
                   1952:        Value    : 00h
                   1953:        Data     : ASCII
                   1954:        Multiple : Yes, order significant
                   1955:        Required : Yes
                   1956:        Summary  : Name of agent that sent this message
                   1957:        
                   1958:        If blank (0 length or nulstr), assumed "Anonymous". If multiple SENDER fields
                   1959:        exist, then the message has been forwarded and the order of the fields in the
                   1960:        record must match the forwarding order (chronologically). When forwarding a
                   1961:        message, the original SENDER field should be left intact and new SENDER,
                   1962:        FORWARDED, and RECIPIENT fields added to the end of the record.
                   1963:        
                   1964:        
                   1965:        Name     : SENDERAGENT
                   1966:        Value    : 01h
                   1967:        Data     : ushort
                   1968:        Multiple : Yes, order significant
                   1969:        Required : No
                   1970:        Default  : AGENT_PERSON or previous SENDERAGENT if exists
                   1971:        Summary  : Type of agent that sent this message
                   1972:        
                   1973:        If multiple SENDER fields exist, then the message has been forwarded. If any of the
                   1974:        forwarding agents is of a type other than AGENT_PERSON, then this field must
                   1975:        follow that SENDER field to specify the agent type.
                   1976:        
                   1977:        Name     : SENDERNETTYPE
                   1978:        Value    : 02h
                   1979:        Data     : ushort
                   1980:        Multiple : Yes, order significant
                   1981:        Required : No
                   1982:        Default  : NET_NONE or previous SENDERNETTYPE if exists
                   1983:        Summary  : Type of network message was sent from
                   1984:        
                   1985:        If multiple SENDERNETADDR fields are included, a SENDERNETTYPE field should be
                   1986:        included before each to determine what data type the address is stored in.
                   1987:        
                   1988:        Name     : SENDERNETADDR
                   1989:        Value    : 03h
                   1990:        Data     : undef
                   1991:        Multiple : Yes, order significant
                   1992:        Required : No
                   1993:        Default  : Previous SENDERNETADDR if exists
                   1994:        Summary  : Network address for agent that sent this message
                   1995:        
                   1996:        The SENDERNETTYPE field indicates the data type of this field. If the
                   1997:        SENDERNETTYPE is of type NET_INTERNET, the local-part of the Internet
                   1998:        address is optional. If the local-part separator character ('@') is omitted,
                   1999:        the SENDER field is assumed to be the local-part of the address.
                   2000: 
                   2001:        _______________________________________________________________________________
                   2002:        Synchronet                           34                      Header Field Types
                   2003: 
                   2004: 
                   2005:        
                   2006:        Name     : SENDEREXT
                   2007:        Value    : 04h
                   2008:        Data     : ASCII
                   2009:        Multiple : Yes, order significant
                   2010:        Required : No
                   2011:        Default  : Previous SENDEREXT if exists
                   2012:        Summary  : Extension of sending agent
                   2013:        
                   2014:        This field is useful for storing the sending agent's extension, when the
                   2015:        agent's extension binds more tightly than the agent's name.
                   2016:        
                   2017:        For example, Synchronet Multinode BBS Software stores local e-mail with the
                   2018:        sending and receiving agent's user numbers stored as their respective
                   2019:        extensions. This is done so that if a user name changes for some reason,
                   2020:        messages will not "disappear" from the user's mail box.
                   2021:        
                   2022:        If the SMB_EMAIL status header attribute is set, then the "From" field in the
                   2023:        index must contain the binary value of this field rather than the CRC-16 of the
                   2024:        SENDER (name) field.
                   2025:        
                   2026:        Name     : SENDERPOS
                   2027:        Value    : 05h
                   2028:        Data     : ASCII
                   2029:        Multiple : Yes, order significant
                   2030:        Required : No
                   2031:        Default  : Previous SENDERPOS if exists
                   2032:        Summary  : Position of sending agent
                   2033:        
                   2034:        Primarily for documentary purposes, this field contains the position of the
                   2035:        sending agent (i.e. President, Sysop, C.E.O., MIS Director, etc).
                   2036:        
                   2037:        It can also be useful for getting a message or reply to the intended
                   2038:        recipient when the agent name is not located or is unknown, but the position
                   2039:        of the agent is known and specified.
                   2040:        
                   2041:        Name     : SENDERORG
                   2042:        Value    : 06h
                   2043:        Data     : ASCII
                   2044:        Multiple : Yes, order significant
                   2045:        Required : No
                   2046:        Default  : Previous SENDERORG if exists
                   2047:        Summary  : Organization name of sending agent
                   2048:        
                   2049:        Primarily for documentary purposes, this field contains the organization to
                   2050:        which the sending agent belongs (i.e. Microsoft, Joe's BBS, SoCal User's Group,
                   2051:        etc).
                   2052: 
                   2053: 
                   2054: 
                   2055: 
                   2056: 
                   2057: 
                   2058: 
                   2059: 
                   2060:        _______________________________________________________________________________
                   2061:        Synchronet                           35                      Header Field Types
                   2062: 
                   2063: 
                   2064:        Name     : AUTHOR
                   2065:        Value    : 10h
                   2066:        Data     : ASCII
                   2067:        Multiple : Yes
                   2068:        Required : No
                   2069:        Default  : First SENDER
                   2070:        Summary  : Name of agent that created this message
                   2071:        
                   2072:        This field can only be added by the process that originally creates the
                   2073:        message. It should not be included if same as first SENDER field. If multiple
                   2074:        AUTHOR fields exist, then the message was created by multiple agents and is
                   2075:        considered valid. The order of multiple AUTHOR fields in the record is not
                   2076:        significant.
                   2077:        
                   2078:        Name     : AUTHORAGENT
                   2079:        Value    : 11h
                   2080:        Data     : ushort
                   2081:        Multiple : Yes, order significant
                   2082:        Required : No
                   2083:        Default  : SENDERAGENT or previous AUTHORAGENT if exists
                   2084:        Summary  : Type of agent that created this message
                   2085:        
                   2086:        This field can only be added by the process that originally creates the
                   2087:        message. It should not be included if same as first SENDERAGENT field. If
                   2088:        multiple AUTHOR fields exist, then the message was created by multiple agents
                   2089:        and if the agent type for any of the authors is other than AGENT_PERSON, an
                   2090:        AUTHORAGENT field must follow to specify the agent type.
                   2091:        
                   2092:        Name     : AUTHORNETTYPE
                   2093:        Value    : 12h
                   2094:        Data     : ushort
                   2095:        Multiple : Yes, order significant
                   2096:        Required : No
                   2097:        Default  : SENDERNETTYPE or previous AUTHORNETTYPE if exists
                   2098:        Summary  : Type of network this author is member of
                   2099:        
                   2100:        Name     : AUTHORNETADDR
                   2101:        Value    : 13h
                   2102:        Data     : undef
                   2103:        Multiple : Yes, order significant
                   2104:        Required : No
                   2105:        Default  : SENDERNETADDR or previous AUTHORNETADDR if exists
                   2106:        Summary  : Network address of this author
                   2107: 
                   2108: 
                   2109: 
                   2110: 
                   2111: 
                   2112: 
                   2113: 
                   2114: 
                   2115: 
                   2116: 
                   2117: 
                   2118: 
                   2119:        _______________________________________________________________________________
                   2120:        Synchronet                           36                      Header Field Types
                   2121: 
                   2122: 
                   2123:        Name     : AUTHOREXT
                   2124:        Value    : 14h
                   2125:        Data     : ASCII
                   2126:        Multiple : Yes, order significant
                   2127:        Required : No
                   2128:        Default  : SENDEREXT or previous AUTHOREXT if exists
                   2129:        Summary  : Extension of this author
                   2130:        
                   2131:        Name     : AUTHORPOS
                   2132:        Value    : 15h
                   2133:        Data     : ASCII
                   2134:        Multiple : Yes, order significant
                   2135:        Required : No
                   2136:        Default  : SENDERPOS or previous AUTHORPOS if exists
                   2137:        Summary  : Position of this author
                   2138:        
                   2139:        Name     : AUTHORORG
                   2140:        Value    : 16h
                   2141:        Data     : ASCII
                   2142:        Multiple : Yes, order significant
                   2143:        Required : No
                   2144:        Default  : SENDERORG or previous AUTHORORG if exists
                   2145:        Summary  : Organization this author belongs to
                   2146: 
                   2147: 
                   2148: 
                   2149: 
                   2150: 
                   2151: 
                   2152: 
                   2153: 
                   2154: 
                   2155: 
                   2156: 
                   2157: 
                   2158: 
                   2159: 
                   2160: 
                   2161: 
                   2162: 
                   2163: 
                   2164: 
                   2165: 
                   2166: 
                   2167: 
                   2168: 
                   2169: 
                   2170: 
                   2171: 
                   2172: 
                   2173: 
                   2174: 
                   2175: 
                   2176: 
                   2177: 
                   2178:        _______________________________________________________________________________
                   2179:        Synchronet                           37                      Header Field Types
                   2180: 
                   2181: 
                   2182:        Name     : REPLYTO
                   2183:        Value    : 20h
                   2184:        Data     : ASCII
                   2185:        Multiple : Yes, but only last is valid
                   2186:        Required : No
                   2187:        Default  : SENDER
                   2188:        Summary  : Name of agent that replies should go to
                   2189:        
                   2190:        Name     : REPLYTOAGENT
                   2191:        Value    : 21h
                   2192:        Data     : ushort
                   2193:        Multiple : Yes, but only last is valid
                   2194:        Required : No
                   2195:        Default  : SENDERAGENT
                   2196:        Summary  : Type of agent that replies should go to
                   2197:        
                   2198:        Name     : REPLYTONETTYPE
                   2199:        Value    : 22h
                   2200:        Data     : ushort
                   2201:        Multiple : Yes, but only last is valid
                   2202:        Required : No
                   2203:        Default  : SENDERNETTYPE
                   2204:        Summary  : Type of network that replies should go to
                   2205:        
                   2206:        Name     : REPLYTONETADDR
                   2207:        Value    : 23h
                   2208:        Data     : undef
                   2209:        Multiple : Yes, but only last is valid
                   2210:        Required : No
                   2211:        Default  : SENDERNETADDR
                   2212:        Summary  : Network address that replies should go to
                   2213: 
                   2214: 
                   2215: 
                   2216: 
                   2217: 
                   2218: 
                   2219: 
                   2220: 
                   2221: 
                   2222: 
                   2223: 
                   2224: 
                   2225: 
                   2226: 
                   2227: 
                   2228: 
                   2229: 
                   2230: 
                   2231: 
                   2232: 
                   2233: 
                   2234: 
                   2235: 
                   2236: 
                   2237:        _______________________________________________________________________________
                   2238:        Synchronet                           38                      Header Field Types
                   2239: 
                   2240: 
                   2241:        Name     : REPLYTOEXT
                   2242:        Value    : 24h
                   2243:        Data     : ASCII
                   2244:        Multiple : Yes, but only last is valid
                   2245:        Required : No
                   2246:        Default  : SENDEREXT
                   2247:        Summary  : Extension of agent that replies should go to
                   2248:        
                   2249:        Name     : REPLYTOPOS
                   2250:        Value    : 25h
                   2251:        Data     : ASCII
                   2252:        Multiple : Yes, but only last is valid
                   2253:        Required : No
                   2254:        Default  : SENDERPOS
                   2255:        Summary  : Position of agent that replies should go to
                   2256:        
                   2257:        Name     : REPLYTOORG
                   2258:        Value    : 26h
                   2259:        Data     : ASCII
                   2260:        Multiple : Yes, but only last is valid
                   2261:        Required : No
                   2262:        Default  : SENDERORG
                   2263:        Summary  : Organization of agent that replies should go to
                   2264: 
                   2265: 
                   2266: 
                   2267: 
                   2268: 
                   2269: 
                   2270: 
                   2271: 
                   2272: 
                   2273: 
                   2274: 
                   2275: 
                   2276: 
                   2277: 
                   2278: 
                   2279: 
                   2280: 
                   2281: 
                   2282: 
                   2283: 
                   2284: 
                   2285: 
                   2286: 
                   2287: 
                   2288: 
                   2289: 
                   2290: 
                   2291: 
                   2292: 
                   2293: 
                   2294: 
                   2295: 
                   2296:        _______________________________________________________________________________
                   2297:        Synchronet                           39                      Header Field Types
                   2298: 
                   2299: 
                   2300:        Name     : RECIPIENT
                   2301:        Value    : 30h
                   2302:        Data     : ASCII
                   2303:        Multiple : Yes, order significant
                   2304:        Required : Yes
                   2305:        Default  : "All"
                   2306:        Summary  : Name of agent to receive this message
                   2307:        
                   2308:        If multiple RECIPIENT fields exist, the message has been forwarded and for each
                   2309:        additional RECIPIENT field (after the initial RECIPIENT), there should be a
                   2310:        FORWARDED field. The order of the RECIPIENT fields in the record must match the
                   2311:        order in which the message was sent and forwarded (chronologically).
                   2312:        
                   2313:        Name     : RECIPIENTAGENT
                   2314:        Value    : 31h
                   2315:        Data     : ushort
                   2316:        Multiple : Yes, order significant
                   2317:        Required : No
                   2318:        Default  : AGENT_PERSON or previous RECIPIENTAGENT if exists
                   2319:        Summary  : Type of agent to receive this message
                   2320:        
                   2321:        If multiple RECIPIENT fields exist, the message has been forwarded. If any of
                   2322:        the recipient agents are of a type other than AGENT_PERSON, this field must
                   2323:        follow the RECIPIENT field to specify the agent type.
                   2324:        
                   2325:        Name     : RECIPIENTNETTYPE
                   2326:        Value    : 32h
                   2327:        Data     : ushort
                   2328:        Multiple : Yes, order significant
                   2329:        Required : No
                   2330:        Default  : NET_NONE or previous RECIPIENTNETTYPE if exists
                   2331:        Summary  : Type of network to receive this message
                   2332:        
                   2333:        Name     : RECIPIENTNETADDR
                   2334:        Value    : 33h
                   2335:        Data     : undef
                   2336:        Multiple : Yes, order significant
                   2337:        Required : No
                   2338:        Default  : Previous RECIPIENTNETADDR if exists
                   2339:        Summary  : Address of network to receive this message
                   2340: 
                   2341: 
                   2342: 
                   2343: 
                   2344: 
                   2345: 
                   2346: 
                   2347: 
                   2348: 
                   2349: 
                   2350: 
                   2351: 
                   2352: 
                   2353: 
                   2354: 
                   2355:        _______________________________________________________________________________
                   2356:        Synchronet                           40                      Header Field Types
                   2357: 
                   2358: 
                   2359:        Name     : RECIPIENTEXT
                   2360:        Value    : 34h
                   2361:        Data     : ASCII
                   2362:        Multiple : Yes, order significant
                   2363:        Required : No
                   2364:        Default  : Previous RECIPIENTEXT if exists
                   2365:        Summary  : Extension of agent to receive this message
                   2366:        
                   2367:        If SMB_EMAIL status header attribute is set, then the "To" field in the index
                   2368:        must contain the binary value of this field rather than the CRC-16 of the
                   2369:        RECIPIENT (name) field. This is the case specifically with the local e-mail
                   2370:        message base on a Synchronet BBS.
                   2371:        
                   2372:        Name     : RECIPIENTPOS
                   2373:        Value    : 35h
                   2374:        Data     : ASCII
                   2375:        Multiple : Yes, order significant
                   2376:        Required : No
                   2377:        Default  : Previous RECIPIENTPOS if exists
                   2378:        Summary  : Position of agent to receive this message
                   2379:        
                   2380:        Name     : RECIPIENTORG
                   2381:        Value    : 36h
                   2382:        Data     : ASCII
                   2383:        Multiple : Yes, order significant
                   2384:        Required : No
                   2385:        Default  : Previous RECIPIENTORG if exists
                   2386:        Summary  : Type of agent to receive this message
                   2387: 
                   2388: 
                   2389: 
                   2390: 
                   2391: 
                   2392: 
                   2393: 
                   2394: 
                   2395: 
                   2396: 
                   2397: 
                   2398: 
                   2399: 
                   2400: 
                   2401: 
                   2402: 
                   2403: 
                   2404: 
                   2405: 
                   2406: 
                   2407: 
                   2408: 
                   2409: 
                   2410: 
                   2411: 
                   2412: 
                   2413: 
                   2414:        _______________________________________________________________________________
                   2415:        Synchronet                           41                      Header Field Types
                   2416: 
                   2417: 
                   2418:        Name     : FORWARDTO
                   2419:        Value    : 40h
                   2420:        Data     : ASCII
                   2421:        Multiple : Yes, order significant
                   2422:        Required : No
                   2423:        Summary  : Name of agent this message is to be forwarded to
                   2424:        
                   2425:        Name     : FORWARDTOAGENT
                   2426:        Value    : 41h
                   2427:        Data     : ushort
                   2428:        Multiple : Yes, order significant
                   2429:        Required : No
                   2430:        Default  : RECIPIENTAGENT or previous FORWARDTOAGENT if exists
                   2431:        Summary  : Type of agent this message is to be forwarded to
                   2432:        
                   2433:        Name     : FORWARDTONETTYPE
                   2434:        Value    : 42h
                   2435:        Data     : ushort
                   2436:        Multiple : Yes, order significant
                   2437:        Required : No
                   2438:        Default  : RECIPIENTNETTYPE or previous FORWARDTONETTYPE if exists
                   2439:        Summary  : Type of network this message is to be forwarded to
                   2440:        
                   2441:        Name     : FORWARDTONETADDR
                   2442:        Value    : 43h
                   2443:        Data     : undef
                   2444:        Multiple : Yes, order significant
                   2445:        Required : No
                   2446:        Default  : RECIPIENTNETADDR or previous FORWARDTONETADDR if exists
                   2447:        Summary  : Network address this message is to be forwarded to
                   2448: 
                   2449: 
                   2450: 
                   2451: 
                   2452: 
                   2453: 
                   2454: 
                   2455: 
                   2456: 
                   2457: 
                   2458: 
                   2459: 
                   2460: 
                   2461: 
                   2462: 
                   2463: 
                   2464: 
                   2465: 
                   2466: 
                   2467: 
                   2468: 
                   2469: 
                   2470: 
                   2471: 
                   2472: 
                   2473:        _______________________________________________________________________________
                   2474:        Synchronet                           42                      Header Field Types
                   2475: 
                   2476: 
                   2477:        Name     : FORWARDTOEXT
                   2478:        Value    : 44h
                   2479:        Data     : ASCII
                   2480:        Multiple : Yes, order significant
                   2481:        Required : No
                   2482:        Default  : RECIPIENTEXT or previous FORWARDTOEXT if exists
                   2483:        Summary  : Extension of agent this message is to be forwarded to
                   2484:        
                   2485:        Name     : FORWARDTOPOS
                   2486:        Value    : 45h
                   2487:        Data     : ASCII
                   2488:        Multiple : Yes, order significant
                   2489:        Required : No
                   2490:        Default  : RECIPIENTPOS or previous FORWARDTOPOS if exists
                   2491:        Summary  : Position of agent this message is to be forwarded to
                   2492:        
                   2493:        Name     : FORWARDTOORG
                   2494:        Value    : 46h
                   2495:        Data     : ASCII
                   2496:        Multiple : Yes, order significant
                   2497:        Required : No
                   2498:        Default  : RECIPIENTORG or previous FORWARDTOORG if exists
                   2499:        Summary  : Organization of agent this message is to be forwarded to
                   2500:        
                   2501:        Name     : FORWARDED
                   2502:        Value    : 48h
                   2503:        Data     : when_t
                   2504:        Multiple : Yes, order significant
                   2505:        Required : Yes, if forwarded
                   2506:        Summary  : Date/Time this message was forwarded to another agent
                   2507: 
                   2508: 
                   2509: 
                   2510: 
                   2511: 
                   2512: 
                   2513: 
                   2514: 
                   2515: 
                   2516: 
                   2517: 
                   2518: 
                   2519: 
                   2520: 
                   2521: 
                   2522: 
                   2523: 
                   2524: 
                   2525: 
                   2526: 
                   2527: 
                   2528: 
                   2529: 
                   2530: 
                   2531: 
                   2532:        _______________________________________________________________________________
                   2533:        Synchronet                           43                      Header Field Types
                   2534: 
                   2535: 
                   2536:        Name     : RECEIVEDBY
                   2537:        Value    : 50h
                   2538:        Data     : ASCII
                   2539:        Multiple : Yes, order significant
                   2540:        Required : Yes, if receiving agent is other than RECIPIENT
                   2541:        Summary  : Name of agent that received this message
                   2542:        
                   2543:        Name     : RECEIVEDBYAGENT
                   2544:        Value    : 51h
                   2545:        Data     : ushort
                   2546:        Multiple : Yes, order significant
                   2547:        Required : No
                   2548:        Default  : RECIPIENTAGENT or previous RECEIVEDBYAGENT if exists
                   2549:        Summary  : Type of agent that received this message
                   2550:        
                   2551:        Name     : RECEIVEDBYNETTYPE
                   2552:        Value    : 52h
                   2553:        Data     : ushort
                   2554:        Multiple : Yes, order significant
                   2555:        Required : No
                   2556:        Default  : RECIPIENTNETTYPE or previous RECEIVEDBYNETTYPE if exists
                   2557:        Summary  : Type of network that received this message
                   2558:        
                   2559:        Name     : RECEIVEDBYNETADDR
                   2560:        Value    : 53h
                   2561:        Data     : undef
                   2562:        Multiple : Yes, order significant
                   2563:        Required : No
                   2564:        Default  : RECIPIENTNETADDR or previous RECEIVEDBYNETADDR if exists
                   2565:        Summary  : Network address that received this message
                   2566: 
                   2567: 
                   2568: 
                   2569: 
                   2570: 
                   2571: 
                   2572: 
                   2573: 
                   2574: 
                   2575: 
                   2576: 
                   2577: 
                   2578: 
                   2579: 
                   2580: 
                   2581: 
                   2582: 
                   2583: 
                   2584: 
                   2585: 
                   2586: 
                   2587: 
                   2588: 
                   2589: 
                   2590: 
                   2591:        _______________________________________________________________________________
                   2592:        Synchronet                           44                      Header Field Types
                   2593: 
                   2594: 
                   2595:        Name     : RECEIVEDBYEXT
                   2596:        Value    : 54h
                   2597:        Data     : ASCII
                   2598:        Multiple : Yes, order significant
                   2599:        Required : No
                   2600:        Default  : RECIPIENTEXT or previous RECEIVEDBYEXT if exists
                   2601:        Summary  : Extension of agent that received this message
                   2602:        
                   2603:        Name     : RECEIVEDBYPOS
                   2604:        Value    : 55h
                   2605:        Data     : ASCII
                   2606:        Multiple : Yes, order significant
                   2607:        Required : No
                   2608:        Default  : RECIPIENTPOS or previous RECEIVEDBYPOS if exists
                   2609:        Summary  : Position of agent that received this message
                   2610:        
                   2611:        Name     : RECEIVEDBYORG
                   2612:        Value    : 56h
                   2613:        Data     : ASCII
                   2614:        Multiple : Yes, order significant
                   2615:        Required : No
                   2616:        Default  : RECIPIENTORG or previous RECEIVEDBYORG if exists
                   2617:        Summary  : Organization of agent that received this message
                   2618:        
                   2619:        Name     : RECEIVED
                   2620:        Value    : 58h
                   2621:        Data     : when_t
                   2622:        Multiple : Yes, order significant
                   2623:        Required : Yes, if received
                   2624:        Default  : NULL
                   2625:        Summary  : Date/Time this message was received
                   2626: 
                   2627: 
                   2628: 
                   2629: 
                   2630: 
                   2631: 
                   2632: 
                   2633: 
                   2634: 
                   2635: 
                   2636: 
                   2637: 
                   2638: 
                   2639: 
                   2640: 
                   2641: 
                   2642: 
                   2643: 
                   2644: 
                   2645: 
                   2646: 
                   2647: 
                   2648: 
                   2649: 
                   2650:        _______________________________________________________________________________
                   2651:        Synchronet                           45                      Header Field Types
                   2652: 
                   2653: 
                   2654:        Name     : SUBJECT
                   2655:        Value    : 60h
                   2656:        Data     : ASCII
                   2657:        Multiple : No
                   2658:        Required : Yes, but may be blank (0 length or nulstr)
                   2659:        Summary  : Subject/title of message
                   2660:        
                   2661:        Name     : SUMMARY
                   2662:        Value    : 61h
                   2663:        Data     : ASCII
                   2664:        Multiple : No
                   2665:        Required : No
                   2666:        Summary  : Summary of message contents, created by AUTHOR
                   2667:        
                   2668:        Name     : COMMENT
                   2669:        Value    : 62h
                   2670:        Data     : ASCII
                   2671:        Multiple : Yes
                   2672:        Required : No
                   2673:        Summary  : Comment about this message, created by SENDER
                   2674:        
                   2675:        This field is useful for adding notes to a message when forwarding to a new
                   2676:        recipient.
                   2677:        
                   2678:        Name     : CARBONCOPY
                   2679:        Value    : 63h
                   2680:        Data     : ASCII
                   2681:        Multiple : Yes
                   2682:        Required : No
                   2683:        Summary  : List of agents this message was also sent to
                   2684:        
                   2685:        This field is optional and only for the use of notifying the recipient of who
                   2686:        else received the message.
                   2687:        
                   2688:        Name     : GROUP
                   2689:        Value    : 64h
                   2690:        Data     : ASCII
                   2691:        Multiple : Yes
                   2692:        Required : No
                   2693:        Summary  : Name of group of users to receive message on recipient system
                   2694:        
                   2695:        This field is used when sending to a group name across a network, where the
                   2696:        group can be expanded into multiple header records for each agent on the
                   2697:        destination system.
                   2698:        
                   2699:        Name     : EXPIRATION
                   2700:        Value    : 65h
                   2701:        Data     : when_t
                   2702:        Multiple : No
                   2703:        Required : No
                   2704:        Summary  : Date/Time that this message will expire
                   2705: 
                   2706: 
                   2707: 
                   2708: 
                   2709:        _______________________________________________________________________________
                   2710:        Synchronet                           46                      Header Field Types
                   2711: 
                   2712: 
                   2713:        Name     : PRIORITY
                   2714:        Value    : 66h
                   2715:        Data     : ulong
                   2716:        Multiple : No
                   2717:        Required : No
                   2718:        Default  : 0
                   2719:        Summary  : Message priority (0 is lowest, FFFFFFFFh is highest)
                   2720: 
                   2721: 
                   2722: 
                   2723: 
                   2724: 
                   2725: 
                   2726: 
                   2727: 
                   2728: 
                   2729: 
                   2730: 
                   2731: 
                   2732: 
                   2733: 
                   2734: 
                   2735: 
                   2736: 
                   2737: 
                   2738: 
                   2739: 
                   2740: 
                   2741: 
                   2742: 
                   2743: 
                   2744: 
                   2745: 
                   2746: 
                   2747: 
                   2748: 
                   2749: 
                   2750: 
                   2751: 
                   2752: 
                   2753: 
                   2754: 
                   2755: 
                   2756: 
                   2757: 
                   2758: 
                   2759: 
                   2760: 
                   2761: 
                   2762: 
                   2763: 
                   2764: 
                   2765: 
                   2766: 
                   2767: 
                   2768:        _______________________________________________________________________________
                   2769:        Synchronet                           47                      Header Field Types
                   2770: 
                   2771: 
                   2772:        Name     : FILEATTACH
                   2773:        Value    : 70h
                   2774:        Data     : ASCII
                   2775:        Multiple : Yes
                   2776:        Required : No
                   2777:        Summary  : Name/file specification of attached file(s)
                   2778:        
                   2779:        Name of attached file(s). Wildcards allowed. MSG_FILEATTACH attribute must be
                   2780:        set. If the MSG_FILEATTACH attribute is set but this field is not included,
                   2781:        the SUBJECT field is assumed to be the filename(s).
                   2782:        
                   2783:        Name     : DESTFILE
                   2784:        Value    : 71h
                   2785:        Data     : ASCII
                   2786:        Multiple : Yes, order significant
                   2787:        Required : No
                   2788:        Summary  : Destination name for attached file(s)
                   2789:        
                   2790:        Wildcards allowed. FILEATTACH field must also be included.
                   2791:        
                   2792:        Name     : FILEATTACHLIST
                   2793:        Value    : 72h
                   2794:        Data     : ASCII
                   2795:        Multiple : Yes
                   2796:        Required : No
                   2797:        Summary  : Name of ASCII list of attached filenames
                   2798:        
                   2799:        Wildcards not allowed in ASCII list filename. Wildcards allowed in ASCII list.
                   2800:        MSG_FILEATTACH attribute must be set.
                   2801:        
                   2802:        Name     : DESTFILELIST
                   2803:        Value    : 73h
                   2804:        Data     : ASCII
                   2805:        Multiple : Yes, order significant
                   2806:        Required : No
                   2807:        Summary  : Name of ASCII list of destination filenames
                   2808:        
                   2809:        Wildcards not allowed in ASCII list filename. Wildcards allowed in ASCII list.
                   2810:        
                   2811:        Name     : FILEREQUEST
                   2812:        Value    : 74h
                   2813:        Data     : ASCII
                   2814:        Multiple : Yes
                   2815:        Required : No
                   2816:        Summary  : Name of requested file
                   2817:        
                   2818:        Wildcards allowed. MSG_FILEREQUEST attribute must be set
                   2819:        
                   2820:        Name     : FILEPASSWORD
                   2821:        Value    : 75h
                   2822:        Data     : ASCII
                   2823:        Multiple : Yes, order significant
                   2824:        Required : No
                   2825:        Summary  : Password for FILEREQUEST
                   2826: 
                   2827:        _______________________________________________________________________________
                   2828:        Synchronet                           48                      Header Field Types
                   2829: 
                   2830: 
                   2831:        
                   2832:        Name     : FILEREQUESTLIST
                   2833:        Value    : 76h
                   2834:        Data     : ASCII
                   2835:        Multiple : Yes
                   2836:        Required : No
                   2837:        Summary  : Name of ASCII list of filenames to request
                   2838:        
                   2839:        Wildcards allowed.
                   2840:        
                   2841:        Name     : FILEPASSWORDLIST
                   2842:        Value    : 77h
                   2843:        Data     : ASCII
                   2844:        Multiple : Yes, order significant
                   2845:        Required : No
                   2846:        Summary  : Name of ASCII list of passwords for FILEREQUESTLIST
                   2847: 
                   2848: 
                   2849: 
                   2850: 
                   2851: 
                   2852: 
                   2853: 
                   2854: 
                   2855: 
                   2856: 
                   2857: 
                   2858: 
                   2859: 
                   2860: 
                   2861: 
                   2862: 
                   2863: 
                   2864: 
                   2865: 
                   2866: 
                   2867: 
                   2868: 
                   2869: 
                   2870: 
                   2871: 
                   2872: 
                   2873: 
                   2874: 
                   2875: 
                   2876: 
                   2877: 
                   2878: 
                   2879: 
                   2880: 
                   2881: 
                   2882: 
                   2883: 
                   2884: 
                   2885: 
                   2886:        _______________________________________________________________________________
                   2887:        Synchronet                           49                      Header Field Types
                   2888: 
                   2889: 
                   2890:        Name     : IMAGEATTACH
                   2891:        Value    : 80h
                   2892:        Data     : mattach_t
                   2893:        Multiple : Yes, order significant
                   2894:        Required : No
                   2895:        Summary  : Type and filename of attached image file for display
                   2896:        
                   2897:        MSG_FILEATTACH attribute must be set. See Image Types for valid
                   2898:        mattach_t.type values.
                   2899:        
                   2900:        Name     : ANIMATTACH
                   2901:        Value    : 81h
                   2902:        Data     : mattach_t
                   2903:        Multiple : Yes, order significant
                   2904:        Required : No
                   2905:        Summary  : Type and filename of attached graphical animation file for display
                   2906:        
                   2907:        MSG_FILEATTACH attribute must be set. See Animation Types for valid
                   2908:        mattach_t.type values.
                   2909:        
                   2910:        Name     : FONTATTACH
                   2911:        Value    : 82h
                   2912:        Data     : mattach_t
                   2913:        Multiple : Yes, order significant
                   2914:        Required : No
                   2915:        Summary  : Type and filename of attached font definition file
                   2916:        
                   2917:        MSG_FILEATTACH attribute must be set. See Font Types for valid mattach_t.type
                   2918:        values.
                   2919:        
                   2920:        Name     : SOUNDATTACH
                   2921:        Value    : 83h
                   2922:        Data     : mattach_t
                   2923:        Multiple : Yes, order significant
                   2924:        Required : No
                   2925:        Summary  : Type and filename of attached sound file for playback
                   2926:        
                   2927:        MSG_FILEATTACH attribute must be set. See Sound Types for valid mattach_t.type
                   2928:        values.
                   2929:        
                   2930:        Name     : PRESENTATTACH
                   2931:        Value    : 84h
                   2932:        Data     : mattach_t
                   2933:        Multiple : Yes, order significant
                   2934:        Required : No
                   2935:        Summary  : Type and filename of attached presentation definition file
                   2936:        
                   2937:        MSG_FILEATTACH attribute must be set. See Present Types for valid
                   2938:        mattach_t.type values.
                   2939: 
                   2940: 
                   2941: 
                   2942: 
                   2943: 
                   2944: 
                   2945:        _______________________________________________________________________________
                   2946:        Synchronet                           50                      Header Field Types
                   2947: 
                   2948: 
                   2949:        Name     : VIDEOATTACH
                   2950:        Value    : 85h
                   2951:        Data     : vattach_t
                   2952:        Multiple : Yes, order significant
                   2953:        Required : No
                   2954:        Summary  : Type and filename of attached interleaved video/sound file
                   2955:        
                   2956:        MSG_FILEATTACH attribute must be set. See Video Types for valid
                   2957:        vattach_t.type values and Video Compression Types for valid vattach_t.comp
                   2958:        values.
                   2959:        
                   2960:        Name     : APPDATAATTACH
                   2961:        Value    : 86h
                   2962:        Data     : mattach_t
                   2963:        Multiple : Yes, order significant
                   2964:        Required : No
                   2965:        Summary  : Name of attached application data file for process/display
                   2966:        
                   2967:        MSG_FILEATTACH attribute must be set. See Application Data Types for valid
                   2968:        mattach_t.type values.
                   2969: 
                   2970: 
                   2971: 
                   2972: 
                   2973: 
                   2974: 
                   2975: 
                   2976: 
                   2977: 
                   2978: 
                   2979: 
                   2980: 
                   2981: 
                   2982: 
                   2983: 
                   2984: 
                   2985: 
                   2986: 
                   2987: 
                   2988: 
                   2989: 
                   2990: 
                   2991: 
                   2992: 
                   2993: 
                   2994: 
                   2995: 
                   2996: 
                   2997: 
                   2998: 
                   2999: 
                   3000: 
                   3001: 
                   3002: 
                   3003: 
                   3004:        _______________________________________________________________________________
                   3005:        Synchronet                           51                      Header Field Types
                   3006: 
                   3007: 
                   3008:        Name     : IMAGETRIGGER
                   3009:        Value    : 90h
                   3010:        Data     : typestr_t
                   3011:        Multiple : Yes, order significant
                   3012:        Required : No
                   3013:        Summary  : Type and filename of image file to trigger for display
                   3014:        
                   3015:        See Image Types for valid typestr_t.type values.
                   3016:        
                   3017:        Name     : ANIMTRIGGER
                   3018:        Value    : 91h
                   3019:        Data     : typestr_t
                   3020:        Multiple : Yes, order significant
                   3021:        Required : No
                   3022:        Summary  : Type and filename of animation file to trigger for display
                   3023:        
                   3024:        See Animation Types for valid typestr_t.type values.
                   3025:        
                   3026:        Name     : FONTTRIGGER
                   3027:        Value    : 92h
                   3028:        Data     : typestr_t
                   3029:        Multiple : Yes, order significant
                   3030:        Required : No
                   3031:        Summary  : Type and filename of font definition file to trigger
                   3032:        
                   3033:        See Font Types for valid typestr_t.type values.
                   3034:        
                   3035:        Name     : SOUNDTRIGGER
                   3036:        Value    : 93h
                   3037:        Data     : typestr_t
                   3038:        Multiple : Yes, order significant
                   3039:        Required : No
                   3040:        Summary  : Type and filename of sound file to trigger for playback
                   3041:        
                   3042:        See Sound Types for valid typestr_t.type values.
                   3043:        
                   3044:        Name     : PRESENTTRIGGER
                   3045:        Value    : 94h
                   3046:        Data     : typestr_t
                   3047:        Multiple : Yes, order significant
                   3048:        Required : No
                   3049:        Summary  : Type and filename of presentation definition file to trigger
                   3050:        
                   3051:        See Present Types for valid typestr_t.type values.
                   3052:        
                   3053:        Name     : VIDEOTRIGGER
                   3054:        Value    : 95h
                   3055:        Data     : typestr_t
                   3056:        Multiple : Yes, order significant
                   3057:        Required : No
                   3058:        Summary  : Type and filename of interleaved video/sound file to trigger
                   3059:        
                   3060:        See Video Types for valid typestr_t.type values.
                   3061:        
                   3062: 
                   3063:        _______________________________________________________________________________
                   3064:        Synchronet                           52                      Header Field Types
                   3065: 
                   3066: 
                   3067:        Name     : APPDATATRIGGER
                   3068:        Value    : 96h
                   3069:        Data     : typestr_t
                   3070:        Multiple : Yes, order significant
                   3071:        Required : No
                   3072:        Summary  : Type and filename of application data file to trigger
                   3073:        
                   3074:        See Application Data Types for valid typestr_t.type values.
                   3075: 
                   3076: 
                   3077: 
                   3078: 
                   3079: 
                   3080: 
                   3081: 
                   3082: 
                   3083: 
                   3084: 
                   3085: 
                   3086: 
                   3087: 
                   3088: 
                   3089: 
                   3090: 
                   3091: 
                   3092: 
                   3093: 
                   3094: 
                   3095: 
                   3096: 
                   3097: 
                   3098: 
                   3099: 
                   3100: 
                   3101: 
                   3102: 
                   3103: 
                   3104: 
                   3105: 
                   3106: 
                   3107: 
                   3108: 
                   3109: 
                   3110: 
                   3111: 
                   3112: 
                   3113: 
                   3114: 
                   3115: 
                   3116: 
                   3117: 
                   3118: 
                   3119: 
                   3120: 
                   3121: 
                   3122:        _______________________________________________________________________________
                   3123:        Synchronet                           53                      Header Field Types
                   3124: 
                   3125: 
                   3126:        Name     : FIDOCTRL
                   3127:        Value    : A0h
                   3128:        Data     : ASCII
                   3129:        Multiple : Yes, order significant
                   3130:        Required : No
                   3131:        Format   : keyword ":" [" "] appdata
                   3132:        Summary  : FTS/FSC-compliant control information line
                   3133:        
                   3134:        Any FidoNet FTS/FSC-compliant control information ("kludge") line that
                   3135:        does not have an equivalent representation here. All data not unique to the
                   3136:        actual control line, including leading and trailing white space, Ctrl-A (01h)
                   3137:        character and terminating CR must be ommited. Defined in FTS-0001.
                   3138:        
                   3139:        Name     : FIDOAREA
                   3140:        Value    : A1h
                   3141:        Data     : ASCII
                   3142:        Multiple : No
                   3143:        Required : No
                   3144:        Summary  : FTN EchoMail conference name.
                   3145:        
                   3146:        Defined in FTS-0004.
                   3147:        
                   3148:        Name     : FIDOSEENBY
                   3149:        Value    : A2h
                   3150:        Data     : ASCII
                   3151:        Multiple : Yes, order significant
                   3152:        Required : No
                   3153:        Format   : net"/"node [" "[net"/"]node] [...]
                   3154:        Summary  : Used to store two-dimensional (net/node) SEEN-BY information
                   3155:        
                   3156:        Often used in FTN EchoMail environments. Only the actual SEEN-BY data is stored
                   3157:        and SEEN-BY: is stripped along with any leading and trailing white space
                   3158:        characters. Defined in FTS-0004.
                   3159:        
                   3160:        Name     : FIDOPATH
                   3161:        Value    : A3h
                   3162:        Data     : ASCII
                   3163:        Multiple : Yes, order significant
                   3164:        Required : No
                   3165:        Format   : net"/"node [" "[net"/"]node] [...]
                   3166:        Summary  : Used to store two-dimensional (net/node)
                   3167:        
                   3168:        Defined in FTS-0004. ^aPATH: is stripped along with any leading and trailing
                   3169:        white space characters.
                   3170: 
                   3171: 
                   3172: 
                   3173: 
                   3174: 
                   3175: 
                   3176: 
                   3177: 
                   3178: 
                   3179: 
                   3180: 
                   3181:        _______________________________________________________________________________
                   3182:        Synchronet                           54                      Header Field Types
                   3183: 
                   3184: 
                   3185:        Name     : FIDOMSGID
                   3186:        Value    : A4h
                   3187:        Data     : ASCII
                   3188:        Multiple : No
                   3189:        Required : No
                   3190:        Format   : origaddr " " serialno
                   3191:        Summary  : MSGID field as specified in FTS-0009.
                   3192:        
                   3193:        Name     : FIDOREPLYID
                   3194:        Value    : A5h
                   3195:        Data     : ASCII
                   3196:        Multiple : No
                   3197:        Required : No
                   3198:        Format   : origaddr " " serialno
                   3199:        Summary  : REPLY field as specified in FTS-0009.
                   3200:        
                   3201:        Name     : FIDOPID
                   3202:        Value    : A6h
                   3203:        Data     : ASCII
                   3204:        Multiple : No
                   3205:        Required : No
                   3206:        Format   : pID " " version [" "serialno]
                   3207:        Summary  : Indentification string of program that created this message
                   3208:        
                   3209:        Defined FSC-0046. "^aPID:" and any white space is not included.
                   3210:        
                   3211:        Name     : FIDOFLAGS
                   3212:        Value    : A7h
                   3213:        Data     : ASCII
                   3214:        Multiple : Yes
                   3215:        Required : No
                   3216:        Summary  : Used to store the FTN FLAGS kludge information
                   3217:        
                   3218:        Note that all FLAG options that have binary representation in the message
                   3219:        header must be removed from the FLAGS string prior to storing it. Only the
                   3220:        actual flags option string is stored and ^aFLAGS is stripped along with any
                   3221:        leading and trailing white space characters. Defined in FSC-0053.
                   3222: 
                   3223: 
                   3224: 
                   3225: 
                   3226: 
                   3227: 
                   3228: 
                   3229: 
                   3230: 
                   3231: 
                   3232: 
                   3233: 
                   3234: 
                   3235: 
                   3236: 
                   3237: 
                   3238: 
                   3239: 
                   3240:        _______________________________________________________________________________
                   3241:        Synchronet                           55                      Header Field Types
                   3242: 
                   3243: 
                   3244:        Name     : RFC822HEADER
                   3245:        Value    : B0h
                   3246:        Data     : ASCII
                   3247:        Multiple : Yes, order significant
                   3248:        Required : No
                   3249:        Format   : field-name ":" [field-body] [CRLF]
                   3250:        Summary  : Undefined RFC-822 header field
                   3251:        
                   3252:        Internet Message storage format, that does not have an equivalent
                   3253:        representation here. Folded header fields are allowed. Terminating CRLF may be
                   3254:        ommited.
                   3255:        
                   3256:        Name     : RFC822MSGID
                   3257:        Value    : B1h
                   3258:        Data     : ASCII
                   3259:        Multiple : No
                   3260:        Required : No
                   3261:        Format   : "<" addr-spec ">"
                   3262:        Summary  : Message-ID field as specified in RFC-822.
                   3263:        
                   3264:        Name     : RFC822REPLYID
                   3265:        Value    : B2h
                   3266:        Data     : ASCII
                   3267:        Multiple : No
                   3268:        Required : No
                   3269:        Format   : "<" addr-spec ">"
                   3270:        Summary  : In-Reply-To field as specified in RFC-822.
                   3271: 
                   3272: 
                   3273: 
                   3274: 
                   3275: 
                   3276: 
                   3277: 
                   3278: 
                   3279: 
                   3280: 
                   3281: 
                   3282: 
                   3283: 
                   3284: 
                   3285: 
                   3286: 
                   3287: 
                   3288: 
                   3289: 
                   3290: 
                   3291: 
                   3292: 
                   3293: 
                   3294: 
                   3295: 
                   3296: 
                   3297: 
                   3298: 
                   3299:        _______________________________________________________________________________
                   3300:        Synchronet                           56                      Header Field Types
                   3301: 
                   3302: 
                   3303:        Name     : UNKNOWN
                   3304:        Value    : F0h
                   3305:        Data     : undef
                   3306:        Multiple : Yes
                   3307:        Required : No
                   3308:        Summary  : Undefined header field of undefined type
                   3309:        
                   3310:        This field is useful for retaining binary header fields (that do not have an
                   3311:        equivalent representation here) between message storage formats.
                   3312:        
                   3313:        Name     : UNKNOWNASCII
                   3314:        Value    : F1h
                   3315:        Data     : ASCII
                   3316:        Multiple : Yes
                   3317:        Required : No
                   3318:        Summary  : Undefined header field of type ASCII
                   3319:        
                   3320:        This field is useful for retaining ASCII header fields (that do not have an
                   3321:        equivalent representation here) between message storage formats.
                   3322:        
                   3323:        Name     : UNUSED
                   3324:        Value    : FFh
                   3325:        Data     : undef
                   3326:        Multiple : Yes
                   3327:        Required : No
                   3328:        Summary  : Unused (deleted) header field
                   3329:        
                   3330:        The data contained in this header field is of an unknown type and should not be
                   3331:        processed.
                   3332:        
                   3333:        
                   3334:        Note:
                   3335:        ----
                   3336:        Specifically, not defined are the values F000h through FFFFh. These values
                   3337:        are to be used for user or system defined header fields. Digital Dynamics
                   3338:        requests that any developers or organizations that wish to have additional
                   3339:        header fields added to this specification notify Digital Dynamics through any
                   3340:        of the contact methods listed at the beginning of this document.
                   3341: 
                   3342: 
                   3343: 
                   3344: 
                   3345: 
                   3346: 
                   3347: 
                   3348: 
                   3349: 
                   3350: 
                   3351: 
                   3352: 
                   3353: 
                   3354: 
                   3355: 
                   3356: 
                   3357: 
                   3358:        _______________________________________________________________________________
                   3359:        Synchronet                           57                      Header Field Types
                   3360: 
                   3361: 
                   3362:        Data Field Types:
                   3363:        ================
                   3364:        
                   3365:        These are the defined valid values for dfield_t.type:
                   3366:        
                   3367:        
                   3368:        Val Name                Data        Description
                   3369:        --- ----                ----        -----------
                   3370:        00h TEXT_BODY           mtext_t     Displayable text (body of message).
                   3371:                                            Included in duplicate message checking.
                   3372:                                            All terminating white space and control
                   3373:                                            characters are to be truncated from data
                   3374:                                            (except when multiple contiguous CRLFs
                   3375:                                            terminate the text, only the last CRLF
                   3376:                                            is removed).
                   3377:        
                   3378:        01h TEXT_SOUL           mtext_t     Non-displayed text.
                   3379:                                            Not normally displayed. Not necessarily
                   3380:                                            displayable.
                   3381:                                            Included in duplicate message checking.
                   3382:        
                   3383:        02h TEXT_TAIL           mtext_t     Displayable text (tag/tear/origin lines,
                   3384:                                            etc).
                   3385:                                            Not included in duplicate message checking.
                   3386:                                            All terminating white space and control
                   3387:                                            characters are to be truncated from data.
                   3388:        
                   3389:        03h TEXT_WING           mtext_t     Non-displayed text.
                   3390:                                            Not normally displayed. Not necessarily
                   3391:                                            displayable.
                   3392:                                            Not included in duplicate message checking.
                   3393:        
                   3394:        10h FTEXT_BODY          ftext_t     Formatted equivalent of TEXT_BODY to be
                   3395:                                            displayed in place of TEXT_BODY if format
                   3396:                                            is supported. See Image Types for valid
                   3397:                                            values of ftext_t.type.
                   3398:        
                   3399:        12h FTEXT_TAIL          ftext_t     Formatted equivalent of TEXT_TAIL to be
                   3400:                                            displayed in place of TEXT_TAIL if format
                   3401:                                            is supported. See Image Types for valid
                   3402:                                            values of ftext_t.type.
                   3403: 
                   3404: 
                   3405: 
                   3406: 
                   3407: 
                   3408: 
                   3409: 
                   3410: 
                   3411: 
                   3412: 
                   3413: 
                   3414: 
                   3415: 
                   3416: 
                   3417:        _______________________________________________________________________________
                   3418:        Synchronet                           58                        Data Field Types
                   3419: 
                   3420: 
                   3421:        20h IMAGEEMBED          membed_t    Type and data of embedded raster image file
                   3422:                                            for display.
                   3423:                                            See Image Types for valid membed.type
                   3424:                                            values.
                   3425:        
                   3426:        21h ANIMEMBED           membed_t    Type and data of embedded graphical
                   3427:                                            animation file for display.
                   3428:                                            See Animation Types for valid membed.type
                   3429:                                            values.
                   3430:        
                   3431:        22h FONTEMBED           membed_t    Type and data of embedded font definition
                   3432:                                            file. See Font Types for valid
                   3433:                                            membed_t.type values.
                   3434:        
                   3435:        23h SOUNDEMBED          membed_t    Type and data of embedded sound file for
                   3436:                                            playback.
                   3437:                                            See Sound Types for valid membed_t.type
                   3438:                                            values.
                   3439:        
                   3440:        24h PRESENTEMBED        membed_t    Type and data of embedded presentation
                   3441:                                            definition file.
                   3442:                                            See Present Types for valid membed_t.type
                   3443:                                            values.
                   3444:        
                   3445:        25h VIDEOEMBED          vembed_t    Type and data of embedded video/sound file
                   3446:                                            for playback.
                   3447:                                            See Video Types for valid vembed_t.type
                   3448:                                            values.
                   3449:                                            See Video Compression Types for valid
                   3450:                                            vembed_t.comp values.
                   3451:        
                   3452:        26h APPDATAEMBED        membed_t    Type and data of embedded application data
                   3453:                                            file for process/display.
                   3454:                                            See Application Data Types for valid
                   3455:                                            membed_t.type values.
                   3456:        
                   3457:        FFh UNUSED              undef       Space allocated for future update/expansion
                   3458:        
                   3459:        
                   3460:        Specifically, not defined are the values F000h through FFFFh. These values
                   3461:        are to be used for user or system defined data fields. Digital Dynamics
                   3462:        requests that any developers or organizations that wish to have additional
                   3463:        data fields added to this specification notify Digital Dynamics through any
                   3464:        of the contact methods listed at the beginning of this document.
                   3465:        
                   3466: 
                   3467: 
                   3468: 
                   3469: 
                   3470: 
                   3471: 
                   3472: 
                   3473: 
                   3474: 
                   3475: 
                   3476:        _______________________________________________________________________________
                   3477:        Synchronet                           59                        Data Field Types
                   3478: 
                   3479: 
                   3480:        Message Attributes:
                   3481:        ------------------
                   3482:        
                   3483:        These are the bit values for idxrec_t.attr and msghdr_t.attr:
                   3484:        
                   3485:        MSG_PRIVATE         (1<<0)  // Private
                   3486:        MSG_READ            (1<<1)  // Read by addressee
                   3487:        MSG_PERMANENT       (1<<2)  // Permanent
                   3488:        MSG_LOCKED          (1<<3)  // Msg is locked, no editing possible
                   3489:        MSG_DELETE          (1<<4)  // Msg is marked for deletion
                   3490:        MSG_ANONYMOUS       (1<<5)  // Anonymous author
                   3491:        MSG_KILLREAD        (1<<6)  // Delete message after it has been read
                   3492:        MSG_MODERATED       (1<<7)  // This message must be validated before export
                   3493:        MSG_VALIDATED       (1<<8)  // This message has been validated by a moderator
                   3494:        
                   3495:        
                   3496:        Auxillary Attributes:
                   3497:        --------------------
                   3498:        These are the bit values for msghdr_t.auxattr:
                   3499:        
                   3500:        MSG_FILEREQUEST     (1<<0)  // File request
                   3501:        MSG_FILEATTACH      (1<<1)  // File(s) attached to Msg
                   3502:        MSG_TRUNCFILE       (1<<2)  // Truncate file(s) when sent
                   3503:        MSG_KILLFILE        (1<<3)  // Delete file(s) when sent
                   3504:        MSG_RECEIPTREQ      (1<<4)  // Return receipt requested
                   3505:        MSG_CONFIRMREQ      (1<<5)  // Confirmation receipt requested
                   3506:        MSG_NODISP          (1<<6)  // Msg may not be displayed to user
                   3507:        
                   3508:        
                   3509:        Network Attributes:
                   3510:        ------------------
                   3511:        These are the bit values for msghdr_t.netattr:
                   3512:        
                   3513:        MSG_LOCAL           (1<<0)  // Msg created locally
                   3514:        MSG_INTRANSIT       (1<<1)  // Msg is in-transit
                   3515:        MSG_SENT            (1<<2)  // Sent to remote
                   3516:        MSG_KILLSENT        (1<<3)  // Kill when sent
                   3517:        MSG_ARCHIVESENT     (1<<4)  // Archive when sent
                   3518:        MSG_HOLD            (1<<5)  // Hold for pick-up
                   3519:        MSG_CRASH           (1<<6)  // Crash
                   3520:        MSG_IMMEDIATE       (1<<7)  // Send Msg now, ignore restrictions
                   3521:        MSG_DIRECT          (1<<8)  // Send directly to destination
                   3522:        MSG_GATE            (1<<9)  // Send via gateway
                   3523:        MSG_ORPHAN          (1<<10) // Unknown destination
                   3524:        MSG_FPU             (1<<11) // Force pickup
                   3525:        MSG_TYPELOCAL       (1<<12) // Msg is for local use only
                   3526:        MSG_TYPEECHO        (1<<13) // Msg is for conference distribution
                   3527:        MSG_TYPENET         (1<<14) // Msg is direct network mail
                   3528: 
                   3529: 
                   3530: 
                   3531: 
                   3532: 
                   3533: 
                   3534: 
                   3535:        _______________________________________________________________________________
                   3536:        Synchronet                           60                      Message Attributes
                   3537: 
                   3538: 
                   3539:        Translation Types:
                   3540:        -----------------
                   3541:        
                   3542:        Definition for values of *.xlat[x]:
                   3543:        
                   3544:        XLAT_NONE           0       // No translation/End of translation list
                   3545:        XLAT_LF2CRLF        1       // Expand sole LF to CRLF
                   3546:        XLAT_ESCAPED        2       // 7-bit ASCII escaping for ctrl and 8-bit data
                   3547:        XLAT_HUFFMAN        3       // Static and adaptive Huffman coding compression
                   3548:        XLAT_LZW            4       // LZW (Lempel-Ziv-Welch) encoding for compression
                   3549:                                    // Terry Welch, IEEE Computer Vol 17, No 6
                   3550:                                    // June 1984, pp 8-19
                   3551:        XLAT_LZC            5       // LZC (modified LZW) encoding for compression
                   3552:                                    // Unix compress program
                   3553:        XLAT_RLE            6       // Run length encoding compression
                   3554:        XLAT_IMPLODE        7       // Implode compression (PKZIP v1.x)
                   3555:        XLAT_SHRINK         8       // Shrink compression (PKZIP v1.x)
                   3556:        XLAT_LZH            9       // LZH dynamic Huffman coding
                   3557:                                    // Haruyasu Yoshizaki, LHarc
                   3558:                                    // November, 1988
                   3559: 
                   3560: 
                   3561: 
                   3562: 
                   3563: 
                   3564: 
                   3565: 
                   3566: 
                   3567: 
                   3568: 
                   3569: 
                   3570: 
                   3571: 
                   3572: 
                   3573: 
                   3574: 
                   3575: 
                   3576: 
                   3577: 
                   3578: 
                   3579: 
                   3580: 
                   3581: 
                   3582: 
                   3583: 
                   3584: 
                   3585: 
                   3586: 
                   3587: 
                   3588: 
                   3589: 
                   3590: 
                   3591: 
                   3592: 
                   3593: 
                   3594:        _______________________________________________________________________________
                   3595:        Synchronet                           61                       Translation Types
                   3596: 
                   3597: 
                   3598:        Agent Types:
                   3599:        -----------
                   3600:        
                   3601:        AGENT_PERSON        0       // To or from person
                   3602:        AGENT_PROCESS       1       // Unknown process, identified by agent name
                   3603:        
                   3604:        Agent types E000h through EFFFh are reserved for Synchronet process types
                   3605:        (defined specifically by Digital Dynamics).
                   3606:        
                   3607:        Note:
                   3608:        ----
                   3609:        Specifically not defined are agent types F000h through FFFFh. These values
                   3610:        are to be used for user or system defined agent types. Digital Dynamics
                   3611:        requests that any developers or organizations that wish to have additional
                   3612:        agent types added to this specification notify Digital Dynamics through any
                   3613:        of the contact methods listed at the beginning of this document.
                   3614: 
                   3615: 
                   3616: 
                   3617: 
                   3618: 
                   3619: 
                   3620: 
                   3621: 
                   3622: 
                   3623: 
                   3624: 
                   3625: 
                   3626: 
                   3627: 
                   3628: 
                   3629: 
                   3630: 
                   3631: 
                   3632: 
                   3633: 
                   3634: 
                   3635: 
                   3636: 
                   3637: 
                   3638: 
                   3639: 
                   3640: 
                   3641: 
                   3642: 
                   3643: 
                   3644: 
                   3645: 
                   3646: 
                   3647: 
                   3648: 
                   3649: 
                   3650: 
                   3651: 
                   3652: 
                   3653:        _______________________________________________________________________________
                   3654:        Synchronet                           62                             Agent Types
                   3655: 
                   3656: 
                   3657:        Network Types:
                   3658:        -------------
                   3659:        
                   3660:                                    // Net Type             Address Format
                   3661:                                    // -----------------------------------
                   3662:        NET_NONE            0       // Locally created      none
                   3663:        NET_UNKNOWN         1       // Unknown              undef
                   3664:        NET_FIDO            2       // FTN network          fidoaddr_t
                   3665:        NET_POSTLINK        3       // PostLink network     none
                   3666:        NET_QWK             4       // QWK based network    ASCII
                   3667:        NET_INTERNET        5       // The Internet         ASCII
                   3668:        NET_WWIV            6       // WWIV based network   ulong
                   3669:        NET_MHS             7       // MHS network          ASCII
                   3670:        
                   3671: 
                   3672: 
                   3673: 
                   3674: 
                   3675: 
                   3676: 
                   3677: 
                   3678: 
                   3679: 
                   3680: 
                   3681: 
                   3682: 
                   3683: 
                   3684: 
                   3685: 
                   3686: 
                   3687: 
                   3688: 
                   3689: 
                   3690: 
                   3691: 
                   3692: 
                   3693: 
                   3694: 
                   3695: 
                   3696: 
                   3697: 
                   3698: 
                   3699: 
                   3700: 
                   3701: 
                   3702: 
                   3703: 
                   3704: 
                   3705: 
                   3706: 
                   3707: 
                   3708: 
                   3709: 
                   3710: 
                   3711: 
                   3712:        _______________________________________________________________________________
                   3713:        Synchronet                           63                           Network Types
                   3714: 
                   3715: 
                   3716:        Media Types:
                   3717:        ===========
                   3718:        
                   3719:        Image Types:
                   3720:        -----------
                   3721:        
                   3722:        IMAGE_UNKNOWN       0x00    // Use image signature header to determine format
                   3723:        IMAGE_ASC           0x01    // ASCII text/IBM extended ASCII graphics
                   3724:        IMAGE_ANS           0x02    // ANSI X3.64 terminal escape sequences
                   3725:        IMAGE_AVT           0x03    // AVATAR terminal escape sequences
                   3726:        IMAGE_LVI           0x04    // LVI terminal escape sequences
                   3727:        IMAGE_GIF           0x05    // Compuserve Graphics Interchange Format (GIF)
                   3728:        IMAGE_TIF           0x06    // Tagged Image Format (AKA TIFF)
                   3729:        IMAGE_JPG           0x07    // Joint Photographers Electronics Group (JPEG)
                   3730:        IMAGE_T16           0x08    // TrueVision 16-bit bitmap (TGA)
                   3731:        IMAGE_T24           0x09    // TrueVision 24-bit bitmap (TGA)
                   3732:        IMAGE_T32           0x0a    // TrueVision 32-bit bitmpa (TGA)
                   3733:        IMAGE_PCX           0x0b    // ZSoft PaintBrush graphics
                   3734:        IMAGE_BMP           0x0c    // Windows bitmap
                   3735:        IMAGE_RLE           0x0d    // Windows bitmap (compressed)
                   3736:        IMAGE_DIB           0x0e    // Display independant bitmap
                   3737:        IMAGE_PCD           0x0f    // Kodak PhotoCD
                   3738:        IMAGE_G3F           0x10    // Group 3 FAX
                   3739:        IMAGE_EPS           0x11    // Ecapsulated PostScript
                   3740:        IMAGE_RTF           0x12    // Rich text format
                   3741:        IMAGE_RIP           0x13    // Remote Imaging Protocol Script (RIPscrip)
                   3742:        IMAGE_NAP           0x14    // NAPLPS
                   3743:        IMAGE_CDR           0x15    // Corel Draw!
                   3744:        IMAGE_CGM           0x16    // Computer graphics metafile
                   3745:        IMAGE_WMF           0x17    // Windows metafile
                   3746:        IMAGE_DFX           0x18    // Autodesk AutoCAD
                   3747:        IMAGE_IFF           0x19    // Amiga Interchange File Format
                   3748:        
                   3749:        
                   3750:        Animation Types:
                   3751:        ---------------
                   3752:        
                   3753:        ANIM_UNKNOWN        0       // Use file signature header to determine format
                   3754:        ANIM_FLI            1       // Autodesk animator
                   3755:        ANIM_FLC            2       // Autodesk
                   3756:        ANIM_GL             3       // Grasprt
                   3757:        ANIM_IFF            4       // Amiga Interchange File Format
                   3758:        
                   3759:        
                   3760:        Video Types:
                   3761:        -----------
                   3762:        
                   3763:        VIDEO_UNKNOWN       0       // Use file signature header to determine format
                   3764:        VIDEO_QTIME         1       // Apple Quick-time
                   3765:        VIDEO_FQTIME        2       // Apple Flattened Quick-time
                   3766:        VIDEO_AVI           3       // Windows Auto/Video Interleave
                   3767:        VIDEO_ULT           4       // OS/2 Ultimotion
                   3768: 
                   3769: 
                   3770: 
                   3771:        _______________________________________________________________________________
                   3772:        Synchronet                           64                             Media Types
                   3773: 
                   3774: 
                   3775:        Video Compression Types:
                   3776:        -----------------------
                   3777:        
                   3778:        VCOMP_UNKNOWN       0       // Use file signature header to determine codec
                   3779:        VCOMP_RLE           1       // Apple animation
                   3780:        VCOMP_SMC           2       // Apple graphics
                   3781:        VCOMP_RPZA          3       // Apple video
                   3782:        VCOMP_KLIC          4       // Captain crunch
                   3783:        VCOMP_CVID          5       // CinePak
                   3784:        VCOMP_RT21          6       // Intel indeo R2
                   3785:        VCOMP_IV31          7       // Intel indeo R3
                   3786:        VCOMP_YVU9          8       // Intel YVU9
                   3787:        VCOMP_JPEG          9       // JPEG
                   3788:        VCOMP_MRLE          10      // Microsoft RLE
                   3789:        VCOMP_MSVC          11      // Microsoft video 1
                   3790:        
                   3791:        
                   3792:        Font Types:
                   3793:        ----------
                   3794:        
                   3795:        FONT_UNKNOWN        0       // Use file signature header to determine format
                   3796:        FONT_TTF            1       // Windows TrueType
                   3797:        FONT_PFB            2       // PostScript Type 1 Font Binary
                   3798:        FONT_PFM            3       // PostScript Type 1 Font Metric
                   3799:        FONT_AMIGA          4       // Amiga Bitmapped
                   3800:        FONT_AGFA           5       // CompuGraphic Fonts
                   3801:        
                   3802:        
                   3803:        Sound Types:
                   3804:        -----------
                   3805:        
                   3806:        SOUND_UNKNOWN       0       // Use file signature header to determine format
                   3807:        SOUND_MOD           1       // MOD format
                   3808:        SOUND_VOC           2       // Sound Blaster VOC format
                   3809:        SOUND_WAV           3       // Windows 3.1 WAV RIFF format
                   3810:        SOUND_MID           4       // MIDI format
                   3811:        SOUND_GMID          5       // General MIDI format (standardized patches)
                   3812:        SOUND_SMP           6       // Turtle Beach SampleVision format
                   3813:        SOUND_SF            7       // IRCAM format
                   3814:        SOUND_AU            8       // Sun Microsystems AU format
                   3815:        SOUND_IFF           9       // Amiga Interchange File Format
                   3816: 
                   3817: 
                   3818: 
                   3819: 
                   3820: 
                   3821: 
                   3822: 
                   3823: 
                   3824: 
                   3825: 
                   3826: 
                   3827: 
                   3828: 
                   3829: 
                   3830:        _______________________________________________________________________________
                   3831:        Synchronet                           65                             Media Types
                   3832: 
                   3833: 
                   3834:        Application Data Types:
                   3835:        ----------------------
                   3836:        
                   3837:        APPDATA_UNKNOWN     0       // Use file signature header to determine format
                   3838:        APPDATA_WORDPERFECT 1       // WordPerfect Document
                   3839:        APPDATA_WKS         2       // Lotus 123 Worksheet (?)
                   3840:        APPDATA_WK1         3       // Lotus 123 Worksheet rev 1
                   3841:        APPDATA_WK2         4       // Lotus 123 Worksheet rev 2
                   3842:        APPDATA_WK3         5       // Lotus 123 Worksheet rev 3
                   3843:        APPDATA_DBF         6       // dBase III data file
                   3844:        APPDATA_PDX         7       // Paradox data file
                   3845:        APPDATA_EXCEL       8       // Excel data file
                   3846:        APPDATA_QUATRO      9       // Borland Quatro Pro file
                   3847:        APPDATA_WORD        10      // Microsoft Word
                   3848: 
                   3849: 
                   3850: 
                   3851: 
                   3852: 
                   3853: 
                   3854: 
                   3855: 
                   3856: 
                   3857: 
                   3858: 
                   3859: 
                   3860: 
                   3861: 
                   3862: 
                   3863: 
                   3864: 
                   3865: 
                   3866: 
                   3867: 
                   3868: 
                   3869: 
                   3870: 
                   3871: 
                   3872: 
                   3873: 
                   3874: 
                   3875: 
                   3876: 
                   3877: 
                   3878: 
                   3879: 
                   3880: 
                   3881: 
                   3882: 
                   3883: 
                   3884: 
                   3885: 
                   3886: 
                   3887: 
                   3888: 
                   3889:        _______________________________________________________________________________
                   3890:        Synchronet                           66                             Media Types
                   3891: 
                   3892: 
                   3893:        Message Storage Pseudo Code
                   3894:        ===========================
                   3895:        
                   3896:        The following is a "C like" pseudo code listing example of adding a message to
                   3897:        an SMB message base. SMBLIB contains C functions to do most of the following
                   3898:        operations. We are supplying this pseudo code as a general definition of the
                   3899:        order of required operations in writing to the message base. Many details have
                   3900:        been left out to simplify the code and to demonstrate only the basic
                   3901:        principles.
                   3902:        
                   3903:        shd = open ( MSGBASE.SHD , READ/WRITE/DENY_NONE )
                   3904:        sdt = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE )
                   3905:        sid = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE )
                   3906:        
                   3907:        lock ( shd , smbhdr )
                   3908:        read ( shd , smbstatus )
                   3909:        
                   3910:        if ( smbstatus.attr & SMB_HYPERALLOC )
                   3911:            msg.hdr.offset = filelength ( sdt )
                   3912:        
                   3913:        else {
                   3914:            number_of_blocks = length_of_message_data / SDT_BLOCK_LEN
                   3915:            if ( length_of_message_data % SDT_BLOCK_LEN )   /* unevenly divisible */
                   3916:                number_of_blocks = number_of_blocks + 1
                   3917:        
                   3918:            sda = open ( MSGBASE.SDA , READ/WRITE/DENY_ALL )
                   3919:        
                   3920:            if ( fast_allocation_mode )
                   3921:                seek ( sda , END_OF_FILE )
                   3922:        
                   3923:            else {
                   3924:                seek ( sda , BEGINNING_OF_FILE )
                   3925:                while ( not end_of_file ( sda ) ) {
                   3926:                    read ( sda , allocated , number_of_blocks * 2 )
                   3927:                    if ( allocated = 0 ) {
                   3928:                        seek_backwards ( sda , number_of_blocks * 2 )
                   3929:                        break
                   3930:                    }
                   3931:                }
                   3932:            }
                   3933:        
                   3934:            msg.hdr.offset = ( current_position ( sda ) / 2 ) * SDT_BLOCK_LEN
                   3935:        
                   3936:            allocated = 1
                   3937:        
                   3938:            write ( sda , allocated , number_of_blocks * 2 )
                   3939:        
                   3940:            close ( sda )
                   3941:        }
                   3942: 
                   3943: 
                   3944: 
                   3945: 
                   3946: 
                   3947: 
                   3948:        _______________________________________________________________________________
                   3949:        Synchronet                           67             Message Storage Pseudo Code
                   3950: 
                   3951: 
                   3952:        seek ( sdt , msg.hdr.offset )
                   3953:        
                   3954:        write ( sdt , message_data )
                   3955:        
                   3956:        if ( smbstatus.attr & SMB_HYPERALLOC )
                   3957:            msg.idx.offset = filelength ( shd )
                   3958:        
                   3959:        else {
                   3960:            number_of_blocks = length_of_message_header / SHD_BLOCK_LEN
                   3961:            if ( length_of_message_header % SHD_BLOCK_LEN )   /* unevenly divisible */
                   3962:                number_of_blocks = number_of_blocks + 1
                   3963:        
                   3964:            sha = open ( MSGBASE.SHA , READ/WRITE/DENY_ALL )
                   3965:        
                   3966:            if ( fast_allocation_mode )
                   3967:                seek ( sha , END_OF_FILE )
                   3968:        
                   3969:            else {
                   3970:                seek ( sha , BEGINNING_OF_FILE )
                   3971:                while ( not end_of_file ( sha ) ) {
                   3972:                    read ( sha , allocated , number_of_blocks )
                   3973:                    if ( allocated = 0 ) {
                   3974:                        seek_backwards ( sha , number_of_blocks )
                   3975:                        break
                   3976:                    }
                   3977:                }
                   3978:            }
                   3979:        
                   3980:            msg.idx.offset = ( current_position ( sha ) * SHD_BLOCK_LEN )
                   3981:            msg.idx.offset = msg.idx.offset + smbstatus.header_offset
                   3982:        
                   3983:            allocated = 1
                   3984:        
                   3985:            write ( sha , allocated , number_of_blocks )
                   3986:        
                   3987:            close ( sha )
                   3988:        }
                   3989:        
                   3990:        seek ( shd , msg.idx.offset )
                   3991:        
                   3992:        msg.hdr.number = smbstatus.last_msg+1
                   3993:        
                   3994:        write ( shd , msg.hdr )
                   3995:        
                   3996:        smbstatus.total_msgs = smbstatus.total_msgs + 1
                   3997:        smbstatus.last_msg = msg.hdr.number
                   3998:        
                   3999:        write ( shd , smbstatus )
                   4000:        
                   4001:        write ( sid , msg.idx )
                   4002:        
                   4003:        unlock ( shd , smbstatus )
                   4004: 
                   4005: 
                   4006: 
                   4007:        _______________________________________________________________________________
                   4008:        Synchronet                           68             Message Storage Pseudo Code
                   4009: 
                   4010: 
                   4011:        Message Retrieval Pseudo Code
                   4012:        =============================
                   4013:        
                   4014:        shd = open ( MSGBASE.SHD , READ/WRITE/DENY_NONE )
                   4015:        sdt = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE )
                   4016:        sid = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE )
                   4017:        
                   4018:        read ( sid , msg.idx )
                   4019:        
                   4020:        seek ( shd , msg.idx.offset )
                   4021:        
                   4022:        lock ( shd , msg.hdr )
                   4023:        
                   4024:        read ( shd , msg.hdr )
                   4025:        
                   4026:        seek ( sdt , msg.hdr.offset )
                   4027:        
                   4028:        read ( sdt , msg.hdr.data_length )
                   4029:        
                   4030:        unlock ( shd , msg.hdr )
                   4031: 
                   4032: 
                   4033: 
                   4034: 
                   4035: 
                   4036: 
                   4037: 
                   4038: 
                   4039: 
                   4040: 
                   4041: 
                   4042: 
                   4043: 
                   4044: 
                   4045: 
                   4046: 
                   4047: 
                   4048: 
                   4049: 
                   4050: 
                   4051: 
                   4052: 
                   4053: 
                   4054: 
                   4055: 
                   4056: 
                   4057: 
                   4058: 
                   4059: 
                   4060: 
                   4061: 
                   4062: 
                   4063: 
                   4064: 
                   4065: 
                   4066:        _______________________________________________________________________________
                   4067:        Synchronet                           69           Message Retrieval Pseudo Code
                   4068: 
                   4069: 
                   4070:        SMBUTIL
                   4071:        =======
                   4072:        
                   4073:        SMBUTIL is a utility that can perform various functions on an SMB message base.
                   4074:        The primary purpose of SMBUTIL is as an example to C programmers of how to use
                   4075:        the SMBLIB functions to access and modify an SMB message base. The complete C
                   4076:        source code for SMBUTIL is included and functions from it can be used or
                   4077:        modified by developers at their own discretion. The following files make up
                   4078:        SMBUTIL:
                   4079:        
                   4080:        SMBUTIL.EXE     Compiled and linked for 16-bit DOS (ready to run)
                   4081:        SMBUTIL.C       C functions
                   4082:        SMBUTIL.H       C definitions and variable prototypes
                   4083:        SMBUTIL.WAT     Makefile for Watcom C/C++ (type wmake -f smbutil.wat)
                   4084:        SMBUTIL.BOR     Makefile for Borland C/C++ (type make -f smbutil.bor)
                   4085:        
                   4086:        The usage syntax is as follows:
                   4087:        
                   4088:        SMBUTIL [/opts] cmd smb_filespec.shd
                   4089:        
                   4090:        where cmd is one or more of the following:
                   4091:        
                   4092:               l[n] = list msgs starting at number n
                   4093:               r[n] = read msgs starting at number n
                   4094:               v[n] = view msg headers starting at number n
                   4095:               k[n] = kill (delete) n msgs
                   4096:               i<f> = import from text file f
                   4097:               s    = display msg base status
                   4098:               c    = change msg base status
                   4099:               m    = maintain msg base - delete old msgs and msgs over max
                   4100:               p[k] = pack msg base (k specifies minimum packable Kbytes)
                   4101:        
                   4102:        where opts is one or more of the following:
                   4103:        
                   4104:               a    = always (force) packing
                   4105:               z<n> = set time zone (n=min +/- from UT or 'EST','EDT','CST',etc)
                   4106:        
                   4107:        and smb_filespec is the base filename or file specification (wildcards) for the
                   4108:        message base. If wildcards are used, the ".SHD" extension must be specified.
                   4109:        
                   4110:        An example command line:
                   4111:        
                   4112:        SMBUTIL MP C:\SBBS\DATA\SUBS\*.SHD
                   4113:        
                   4114:        would maintain and pack all the message bases found in the C:\SBBS\DATA\SUBS
                   4115:        directory.
                   4116: 
                   4117: 
                   4118: 
                   4119: 
                   4120: 
                   4121: 
                   4122: 
                   4123: 
                   4124: 
                   4125:        _______________________________________________________________________________
                   4126:        Synchronet                           70                                 SMBUTIL
                   4127: 
                   4128: 
                   4129:        CHKSMB
                   4130:        ======
                   4131:        
                   4132:        CHKSMB is a utility that performs a comprehensive analysis of a message base
                   4133:        to find any possible errors and calculate the number of packable bytes. It does
                   4134:        not "fix" a message base if any errors are found, it only reports the specific
                   4135:        errors (and exits with a non-zero error level). If any errors are reported,
                   4136:        packing the message base with SMBUTIL may rebuild the damaged files. If that
                   4137:        doesn't work, then use FIXSMB as a last resort.
                   4138:        
                   4139:        C source code for CHKSMB is also included as an example to programmers of how
                   4140:        to use SMBLIB functions.
                   4141:        
                   4142:        The usage syntax is as follows:
                   4143:        
                   4144:        CHKSMB [/opts] smb_filespec.shd
                   4145:        
                   4146:        where opts is one or more of the following:
                   4147:        
                   4148:                q   = quiet mode (no beeps)
                   4149:                s   = stop after an errored message base (for use with wildcards)
                   4150:                p   = pause after an errored message base (wait for key press)
                   4151:                t   = don't check for unsupported translation strings (faster)
                   4152:                e   = display extended information on corrupted messages
                   4153:        
                   4154:        An example command line:
                   4155:        
                   4156:        CHKSMB /QP C:\SBBS\DATA\SUBS\*.SHD
                   4157:        
                   4158:        would check all the message bases in the C:\SBBS\DATA\SUBS directory, without
                   4159:        beeping on errors, and pausing after an errored message base.
                   4160: 
                   4161: 
                   4162: 
                   4163: 
                   4164: 
                   4165: 
                   4166: 
                   4167: 
                   4168: 
                   4169: 
                   4170: 
                   4171: 
                   4172: 
                   4173: 
                   4174: 
                   4175: 
                   4176: 
                   4177: 
                   4178: 
                   4179: 
                   4180: 
                   4181: 
                   4182: 
                   4183: 
                   4184:        _______________________________________________________________________________
                   4185:        Synchronet                           71                                  CHKSMB
                   4186: 
                   4187: 
                   4188:        FIXSMB
                   4189:        ======
                   4190:        
                   4191:        FIXSMB is a utility that will rebuild the index and allocation files for a
                   4192:        message base. Since the message headers are not necessarily stored
                   4193:        sequentially, the order of the messages in the index may be changed when the
                   4194:        index is rebuilt. Messages are also re-numbered, so only use this program if
                   4195:        the index is corrupted and the messages are extremely important.
                   4196:        
                   4197:        C source code for FIXSMB is also included as an example to programmers of how
                   4198:        to use SMBLIB functions.
                   4199:        
                   4200:        The usage syntax is as follows:
                   4201:        
                   4202:        FIXSMB [/M] smb_file
                   4203:        
                   4204:        An example command line:
                   4205:        
                   4206:        FIXSMB \SBBS\DATA\MAIL
                   4207:        
                   4208:        Only use the "/M" command line switch if fixing an older Synchronet e-mail
                   4209:        message base (created with SBBS v2.1 or earlier). Once the SMB_EMAIL status
                   4210:        attr is set ("SMBUTIL S" will report a status attr of 1), the "/M" is not
                   4211:        required.
                   4212: 
                   4213: 
                   4214: 
                   4215: 
                   4216: 
                   4217: 
                   4218: 
                   4219: 
                   4220: 
                   4221: 
                   4222: 
                   4223: 
                   4224: 
                   4225: 
                   4226: 
                   4227: 
                   4228: 
                   4229: 
                   4230: 
                   4231: 
                   4232: 
                   4233: 
                   4234: 
                   4235: 
                   4236: 
                   4237: 
                   4238: 
                   4239: 
                   4240: 
                   4241: 
                   4242: 
                   4243:        _______________________________________________________________________________
                   4244:        Synchronet                           72                                  FIXSMB
                   4245: 
                   4246: 
                   4247:        SMBLIB
                   4248:        ======
                   4249:        
                   4250:        SMBLIB is a library of C functions for accessing and storing messages in an
                   4251:        SMB format message base. It can eliminate much of the development time for
                   4252:        developers that wish to use the library in whole or in part, or use the
                   4253:        functions as examples for their own message base function library. The library
                   4254:        consists of the following files:
                   4255:        
                   4256:        SMBDEFS.H       Constant definitions, macros, and data types
                   4257:        SMBLIB.H        Library constants and function prototypes
                   4258:        SMBLIB.C        Function definitions
                   4259:        SMBVARS.C       Global variable definitions (doubles as declaration file)
                   4260:        
                   4261:        For developers to use this library with their program, they must include the
                   4262:        "SMBLIB.H" header file at the top of each C file that uses any of the library
                   4263:        functions, global variables, data types, macros, and constants. This can be
                   4264:        done by simply adding the following line to each .C file:
                   4265:        
                   4266:        #include "smblib.h"
                   4267:        
                   4268:        If SMBLIB.H is included, there is no need to include SMBDEFS.H or SMBVARS.C.
                   4269:        
                   4270:        To link the library functions and variables with a main program, the files
                   4271:        SMBVARS.OBJ and SMBLIB.OBJ must be linked with the main program .OBJ files.
                   4272:        If the operating system is DOS, be sure that all .OBJ files are compiled for
                   4273:        the same memory model.
                   4274:        
                   4275:        Example MAKEFILEs for compiling and linking SMBUTIL with Borland C/C++
                   4276:        (SMBUTIL.BOR) and Watcom C/C++ (SMBUTIL.WAT) are included.
                   4277: 
                   4278: 
                   4279: 
                   4280: 
                   4281: 
                   4282: 
                   4283: 
                   4284: 
                   4285: 
                   4286: 
                   4287: 
                   4288: 
                   4289: 
                   4290: 
                   4291: 
                   4292: 
                   4293: 
                   4294: 
                   4295: 
                   4296: 
                   4297: 
                   4298: 
                   4299: 
                   4300: 
                   4301: 
                   4302:        _______________________________________________________________________________
                   4303:        Synchronet                           73                                  SMBLIB
                   4304: 
                   4305: 
                   4306:        SMBDEFS.H
                   4307:        =========
                   4308:        
                   4309:        The SMBDEFS.H file contains important constant definitions and data types (also
                   4310:        defined in this document). If ever this document and SMBDEFS.H are inconsistent
                   4311:        with each other, then SMBDEFS.H is to be considered correct and this document
                   4312:        in error. If such a discrepency is found, please notifiy Digital Dynamics so it
                   4313:        can be corrected in a future revision of the specification.
                   4314:        
                   4315:        Most notable of the data types is a structure called smbmsg_t (not defined
                   4316:        in this document). It contains the fixed and variable portions of a message's
                   4317:        header record as well as convenience pointers to the sender's name
                   4318:        (smbmsg_t.to), recipient's name (smbmsg_t.from), network addresses, and more.
                   4319:        If multiple SENDER header fields are included (for example), then smbmsg_t.to
                   4320:        will point to the last SENDER header field in the header record. Convenience
                   4321:        pointers for other data items work in the same fasion if multiple header fields
                   4322:        of the same type exist in the header record.
                   4323:        
                   4324:        Variables of the smbmsg_t data type (and pointers to variables of smbmsg_t
                   4325:        type) are used as arguments to many of the SMBLIB functions.
                   4326: 
                   4327: 
                   4328: 
                   4329: 
                   4330: 
                   4331: 
                   4332: 
                   4333: 
                   4334: 
                   4335: 
                   4336: 
                   4337: 
                   4338: 
                   4339: 
                   4340: 
                   4341: 
                   4342: 
                   4343: 
                   4344: 
                   4345: 
                   4346: 
                   4347: 
                   4348: 
                   4349: 
                   4350: 
                   4351: 
                   4352: 
                   4353: 
                   4354: 
                   4355: 
                   4356: 
                   4357: 
                   4358: 
                   4359: 
                   4360: 
                   4361:        _______________________________________________________________________________
                   4362:        Synchronet                           74                               SMBDEFS.H
                   4363: 
                   4364: 
                   4365:        SMBVARS.C
                   4366:        =========
                   4367:        
                   4368:        The SMBVARS.C file contains definitions of the global variables used by the
                   4369:        SMBLIB functions. It is a fairly small file since their are a small number of
                   4370:        global variables (by design). This file is used for both definitions and
                   4371:        declarations, so no "extern" declarations need to be made in developers source
                   4372:        code as long as SMBVARS.C or (preferably) SMBLIB.H is included in the source
                   4373:        code.
                   4374: 
                   4375: 
                   4376: 
                   4377: 
                   4378: 
                   4379: 
                   4380: 
                   4381: 
                   4382: 
                   4383: 
                   4384: 
                   4385: 
                   4386: 
                   4387: 
                   4388: 
                   4389: 
                   4390: 
                   4391: 
                   4392: 
                   4393: 
                   4394: 
                   4395: 
                   4396: 
                   4397: 
                   4398: 
                   4399: 
                   4400: 
                   4401: 
                   4402: 
                   4403: 
                   4404: 
                   4405: 
                   4406: 
                   4407: 
                   4408: 
                   4409: 
                   4410: 
                   4411: 
                   4412: 
                   4413: 
                   4414: 
                   4415: 
                   4416: 
                   4417: 
                   4418: 
                   4419: 
                   4420:        _______________________________________________________________________________
                   4421:        Synchronet                           75                               SMBVARS.C
                   4422: 
                   4423: 
                   4424:        SMBLIB.H
                   4425:        =======
                   4426:        
                   4427:        The SMBLIB.H file contains prototypes of all the functions in the SMBLIB.C
                   4428:        file. It is necessary to include this file in C source code if any of the
                   4429:        SMBLIB functions are used. The following C source line will include this file:
                   4430:        
                   4431:        #include "smblib.h"
                   4432:        
                   4433:        and should be placed near the top of all C source files that use SMBLIB
                   4434:        functions, variables, constants, or data types.
                   4435:        
                   4436:        Function prototypes are necessary for compilers to know the correct calling
                   4437:        syntax of a function and detect incorrect usage. Prototypes are also useful
                   4438:        as a quick reference for programmers as to the correct calling syntax of a
                   4439:        specific function.
                   4440: 
                   4441: 
                   4442: 
                   4443: 
                   4444: 
                   4445: 
                   4446: 
                   4447: 
                   4448: 
                   4449: 
                   4450: 
                   4451: 
                   4452: 
                   4453: 
                   4454: 
                   4455: 
                   4456: 
                   4457: 
                   4458: 
                   4459: 
                   4460: 
                   4461: 
                   4462: 
                   4463: 
                   4464: 
                   4465: 
                   4466: 
                   4467: 
                   4468: 
                   4469: 
                   4470: 
                   4471: 
                   4472: 
                   4473: 
                   4474: 
                   4475: 
                   4476: 
                   4477: 
                   4478: 
                   4479:        _______________________________________________________________________________
                   4480:        Synchronet                           76                                SMBLIB.H
                   4481: 
                   4482: 
                   4483:        SMBLIB.C
                   4484:        =======
                   4485:        
                   4486:        The SMBLIB.C file contains the actual SMBLIB library functions. This source
                   4487:        file is not a stand alone program, but instead must be compiled and linked
                   4488:        with a main source file to create the executable program.
                   4489:        
                   4490:        The functions in this file are organized in a logical order, but their order
                   4491:        is actually irrelevant to the compiling, linking, and execution of the
                   4492:        resulting program.
                   4493:        
                   4494:        A comment block preceeds each function, explaining what the function does,
                   4495:        how the passed parameters are used, and what the return code (if any)
                   4496:        indicates. A more detailed explanation of each function is included here:
                   4497:        
                   4498:        int smb_open(int retry_time)
                   4499:        ----------------------------
                   4500:        The smb_open() function must be called before the message base is accessed
                   4501:        (read from or written to). The parameter, retry_time, is the maximum number
                   4502:        of seconds to wait while retrying to lock the message base header. If
                   4503:        retry_time is 0, then the message base header is not locked or read (this is
                   4504:        called "Fast Open" and should only be used when speed is more important than
                   4505:        checking for compatibility and validity upon opening). The global variable
                   4506:        smb_file must be initialized with the path and base filename of the message
                   4507:        base. This function returns 0 on success, 1 if the .SDT file could not be
                   4508:        opened, 2 if the .SHD file could not be opened, and 3 if the .SID file could
                   4509:        not be opened. If the message base header could not be locked, this function
                   4510:        returns -1. If the message base ID is incorrect, it returns -2. And if the
                   4511:        message base is of an incompatible version, it returns -3.
                   4512:        
                   4513:        The errno global variable (standard of most C libraries) will most likely
                   4514:        contain the error code for open failure.
                   4515:        
                   4516:        int smb_open_da(int retry_time)
                   4517:        -------------------------------
                   4518:        The smb_open_da() function is used to open the data block allocation file for
                   4519:        writing messages to a message base. The parameter, retry_time, is the maximum
                   4520:        number of seconds to wait while retrying to open the file. This function
                   4521:        returns 0 on success. -1 is returned if an open error other than "Access
                   4522:        Denied" is returned from the operating system, and the global variable errno
                   4523:        will contain the error code. -2 is returned if the retry_time has been
                   4524:        reached, and -3 is returned if the file descriptor could not be converted to
                   4525:        a stream by the fdopen() function.
                   4526:        
                   4527:        fclose(sda_fp) should be called immediately after all necessary file access
                   4528:        has been completed.
                   4529:        
                   4530:        This function is not used with the Hyper Allocation storage method.
                   4531: 
                   4532: 
                   4533: 
                   4534: 
                   4535: 
                   4536: 
                   4537: 
                   4538:        _______________________________________________________________________________
                   4539:        Synchronet                           77                                SMBLIB.C
                   4540: 
                   4541: 
                   4542:        int smb_open_ha(int retry_time)
                   4543:        -------------------------------
                   4544:        The smb_open_ha() function is used to open the header block allocation file for
                   4545:        writing messages to a message base. The parameter, retry_time, is the maximum
                   4546:        number of seconds to wait while retrying to open the file. This function
                   4547:        returns 0 on success. -1 is returned if an open error other than "Access
                   4548:        Denied" is returned from the operating system, and the global variable errno
                   4549:        will contain the error code. -2 is returned if the retry_time has been
                   4550:        reached, and -3 is returned if the file descriptor could not be converted to
                   4551:        a stream by the fdopen() function.
                   4552:        
                   4553:        fclose(sha_fp) should be called immediately after all necessary file access
                   4554:        has been completed.
                   4555:        
                   4556:        This function is not used with the Hyper Allocation storage method.
                   4557:        
                   4558:        int smb_create(ulong max_crcs, ulong max_msgs, ushort max_age, ushort attr
                   4559:            ,int retry_time)
                   4560:        --------------------------------------------------------------------------
                   4561:        The smb_create() function is used to create a new message base or reset an
                   4562:        existing message base. The parameters max_crcs, max_msgs, max_age, and attr
                   4563:        are used to set the initial status of the message base status header. The
                   4564:        parameter, retry_time is the maximum number of seconds to wait while retrying
                   4565:        to lock the message base header. This functions returns 0 on success or 1 if
                   4566:        the message base header could not be locked.
                   4567:        
                   4568:        int smb_trunchdr(int retry_time)
                   4569:        --------------------------------
                   4570:        The smb_trunchdr() function is used to truncate the header file when packing
                   4571:        the message base and writing the new header information back to the header
                   4572:        file. The parameter, retry_time is the maximum number of seconds to wait while
                   4573:        retrying to truncate the header file. Returns 0 on success, -1 if error was
                   4574:        other than "Access Denied", or -2 if retry_time reached.
                   4575:        
                   4576:        int smb_locksmbhdr(int retry_time)
                   4577:        ----------------------------------
                   4578:        The smb_locksmbhdr() function is used to lock the first message base (status)
                   4579:        header. The parameter, retry_time is the number of seconds to wait while
                   4580:        retrying to lock the header. The smb_unlocksmbhdr() function should always be
                   4581:        used to unlock the header after accessing the message base header (usually
                   4582:        with smb_getstatus() and/or smb_putstatus()). Returns 0 if successful, -1 if
                   4583:        unsuccessful.
                   4584:        
                   4585:        int smb_unlocksmbhdr()
                   4586:        ----------------------
                   4587:        The smb_unlocksmbhdr() function is used to unlock a previously locked message
                   4588:        base header (using smb_lockmsghdr()). Returns 0 on success, non-zero on
                   4589:        failure.
                   4590:        
                   4591:        int smb_getstatus(smbstatus_t *hdr)
                   4592:        -----------------------------------
                   4593:        The smb_getstatus() function is used to read the status message base header
                   4594:        into the hdr structure. Returns 0 on success, 1 on failure.
                   4595: 
                   4596: 
                   4597:        _______________________________________________________________________________
                   4598:        Synchronet                           78                                SMBLIB.C
                   4599: 
                   4600: 
                   4601:        int smb_putstatus(smbstatus_t hdr)
                   4602:        ----------------------------------
                   4603:        The smb_putstatus() function is used to write the status information to the
                   4604:        first message base header. The parameter hdr, contains the status information
                   4605:        to be written. Returns 0 on success, 1 on failure.
                   4606:        
                   4607:        int smb_getmsgidx(smbmsg_t *msg)
                   4608:        --------------------------------
                   4609:        The smb_getmsgidx() function is used to get the byte offset for a specific
                   4610:        message header in the message header file based on the message base index.
                   4611:        
                   4612:        If msg->hdr.number is non-zero when this function is called, then the index
                   4613:        will be searched for this message number. If the message number is found in
                   4614:        the index, the msg->idx.offset is set to the byte offset of the message header
                   4615:        record in the header file and msg->offset is set to the record offset of the
                   4616:        index record in the index file, and the function returns 0. If the message
                   4617:        number is not found in the index, the function returns 1.
                   4618:        
                   4619:        If msg->hdr.number is zero, msg->idx.offset and msg->idx.number are obtained
                   4620:        from the index record at record offset msg->offset. If msg->offset is an
                   4621:        invalid record offset when this function is called, the function returns 1.
                   4622:        Otherwise, the function returns 0.
                   4623:        
                   4624:        int smb_getlastidx(idxrec_t *idx)
                   4625:        ---------------------------------
                   4626:        Reads the last index record of the currently open message base into the
                   4627:        idxrec_t structure pointed to by idx. Returns 0 if successful, -1 if the index
                   4628:        is empty or unopened, or -2 if the record can't be read.
                   4629:        
                   4630:        int smb_getmsghdrlen(smbmsg_t msg)
                   4631:        ----------------------------------
                   4632:        The smb_getmsghdrlen() function is used to calculate the total length of
                   4633:        message header msg including both fixed and variable length portions. This
                   4634:        function returns the length of the header record in bytes.
                   4635:        
                   4636:        long smb_getmsgdatlen(smbmsg_t msg)
                   4637:        -----------------------------------
                   4638:        The smb_getmsgdatlen() function is used to calculate the total length of the
                   4639:        data for message msg. This function returns the length of all data fields
                   4640:        combined.
                   4641:        
                   4642:        int smb_lockmsghdr(smbmsg_t msg, int retry_time)
                   4643:        ------------------------------------------------
                   4644:        The smb_lockmsghdr() function is used to lock the header record for message
                   4645:        msg. The parameter retry_time is the maximum number of seconds to wait while
                   4646:        retrying to lock the header. Returns 0 on success, -1 on failure. The function
                   4647:        smb_unlockmsghdr() should immediately be called after accessing the message
                   4648:        header (usually with smb_getmsghdr() or smb_putmsghdr()).
                   4649: 
                   4650: 
                   4651: 
                   4652: 
                   4653: 
                   4654: 
                   4655: 
                   4656:        _______________________________________________________________________________
                   4657:        Synchronet                           79                                SMBLIB.C
                   4658: 
                   4659: 
                   4660:        int smb_getmsghdr(smbmsg_t *msg)
                   4661:        --------------------------------
                   4662:        The function smb_getmsghdr() is used to read the header record for message
                   4663:        msg. msg->idx.offset must be initialized to the byte offset of the header
                   4664:        record in the header file before this function is called. The function
                   4665:        smb_freemsgmem() must be called to free the memory allocated by this function
                   4666:        for the header and data felds. This function returns 0 on success, -1 if
                   4667:        the fixed portion of the message header record could not be read, -2 if the
                   4668:        message header ID was incorrect, -3 if memory could not be allocated, -4
                   4669:        if a data field could not be read, -5 if the fixed length portion of a header
                   4670:        field could not be read, -6 if the variable length portion of a header field
                   4671:        could not be read, -7 if one or more of the mandatory header fields (SENDER,
                   4672:        RECIPIENT, or SUBJECT) are missing, -8 if total_dfields extends beyond the
                   4673:        end of the header record, or -9 if incompatible header version.
                   4674:        
                   4675:        Several convenience pointers in the msg structure are initialized by this
                   4676:        function to point to the last occurance of the SENDER (msg->from), RECIPIENT
                   4677:        (msg->to), SUBJECT (msg->subj), etc.
                   4678:        
                   4679:        int smb_unlockmsghdr(smbmsg_t msg)
                   4680:        ----------------------------------
                   4681:        The smb_unlockmsghdr() function is used to unlock a previously locked message
                   4682:        header (with smb_lockmsghdr()). This function returns 0 on success, non-zero
                   4683:        on failure.
                   4684:        
                   4685:        int smb_addcrc(ulong max_crcs, ulong crc, int retry_time)
                   4686:        ---------------------------------------------------------
                   4687:        The smb_addcrc() function is used to add a CRC-32 to the CRC history file
                   4688:        for a message base, automatically checking for duplicates. The parameter
                   4689:        max_crcs should be the max_crcs defined in the status header of the message
                   4690:        base. The parameter crc, is the CRC-32 of the TEXT_BODY and TEXT_SOUL data
                   4691:        fields for the message. The parameter retry_time is the maximum number of
                   4692:        seconds to wait when retrying to open the CRC history file.
                   4693:        
                   4694:        This function returns -1 if there was an open error, -2 if the retry_time
                   4695:        was reached, -3 if there was a memory allocation error, 1 if the CRC already
                   4696:        exists in the CRC history file (indicating a duplicate message), or 0 on
                   4697:        success (and no duplicate).
                   4698:        
                   4699:        int smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data)
                   4700:        ---------------------------------------------------------------------
                   4701:        The smb_hfield() function is used to add a header field to the structure msg.
                   4702:        The parameters type, length, and data, must be specified according to the
                   4703:        header field values listed in this specification. This function returns 0
                   4704:        on success, non-zero on memory allocation error. The function smb_freemsgmem()
                   4705:        must be called to free the memory allocated by this function.
                   4706:        
                   4707:        int smb_dfield(smbmsg_t *msg, ushort type, ulong length)
                   4708:        --------------------------------------------------------
                   4709:        The smb_dfield() function is used to add a data field to the structure msg.
                   4710:        The parameters type and length must be specified according to the data field
                   4711:        values listed in this specification. This function returns 0 on success,
                   4712:        non-zero on memory allocation error. The function smb_freemsgmem() must be
                   4713:        called to free the memory allocated by this function.
                   4714: 
                   4715:        _______________________________________________________________________________
                   4716:        Synchronet                           80                                SMBLIB.C
                   4717: 
                   4718: 
                   4719:        int smb_addmsghdr(smbmsg_t *msg,smbstatus_t *status,int storage,int retry_time)
                   4720:        -------------------------------------------------------------------------------
                   4721:        The smb_addmsghdr() function is used to add a new message header to the message
                   4722:        header file and update the index file. The msg and status structures are
                   4723:        updated to reflect the new total messages, last message number, etc. The
                   4724:        storage parameter is used to indicate the storage method to use (either
                   4725:        SMB_SELFPACK, SMB_FASTALLOC, or SMB_HYPERALLOC). If the storage type is
                   4726:        SMB_SELFPACK, the header block allocation file will be searched for unused
                   4727:        block(s) to store this header. If the storage type is SMB_FASTALLOC or
                   4728:        SMB_HYPERALLOC, the header is stored at the end of the header file. Returns 0
                   4729:        on success, non-zero on failure. The parameter retry_time is the maximum number
                   4730:        of seconds to wait while retrying to lock and open files.
                   4731:        
                   4732:        int smb_putmsg(smbmsg_t msg)
                   4733:        ----------------------------
                   4734:        The smb_putmsg() function calls both the smb_putmsghdr() and smb_putmsgidx()
                   4735:        functions to write the header and index elements of a message to the
                   4736:        appropriate files. Returns 0 on success, non-zero on failure.
                   4737:        
                   4738:        int smb_putmsgidx(smbmsg_t msg)
                   4739:        -------------------------------
                   4740:        The smb_putmsgidx() function is used to store a message index in the message
                   4741:        index file. The message index can be for a new message or an existing
                   4742:        message. Returns 0 on success, non-zero on failure.
                   4743:        
                   4744:        int smb_putmsghdr(smbmsg_t msg)
                   4745:        -------------------------------
                   4746:        The smb_putmsghdr() function is used to store a message header in the message
                   4747:        header file. The message header can be for a new message or an existing
                   4748:        message. Returns 0 on success, non-zero on failure.
                   4749:        
                   4750:        void smb_freemsgmem(smbmsg_t msg)
                   4751:        ---------------------------------
                   4752:        Frees allocated memory for the header and data fields in the msg structure.
                   4753:        This function must be called to free the memory allocated by the functions
                   4754:        smb_hfield(), smb_dfield(), and smb_getmsghdr().
                   4755:        
                   4756:        long smb_hdrblocks(ulong length)
                   4757:        --------------------------------
                   4758:        The smb_hdrblocks() function is used to calculate the number of blocks
                   4759:        required to store a message header of length size (in bytes). This function
                   4760:        returns the number of blocks required.
                   4761:        
                   4762:        long smb_datblocks(ulong length)
                   4763:        --------------------------------
                   4764:        The smb_datblocks() function is used to calculate the number of blocks
                   4765:        required to store message data of length size (in byte). This function returns
                   4766:        the number of blocks required.
                   4767: 
                   4768: 
                   4769: 
                   4770: 
                   4771: 
                   4772: 
                   4773: 
                   4774:        _______________________________________________________________________________
                   4775:        Synchronet                           81                                SMBLIB.C
                   4776: 
                   4777: 
                   4778:        long smb_allochdr(ulong length)
                   4779:        -------------------------------
                   4780:        The smb_allochdr() function is used to search for free blocks to store a
                   4781:        message header of length bytes and mark the free blocks as allocated in the
                   4782:        header allocation file. This function returns the byte offset to the header
                   4783:        record or a negative number on error. The function smb_open_ha() should be
                   4784:        called prior to calling this function and fclose(sha_fp) should be called
                   4785:        after. The function is called from smb_addmsghdr(), so you probably have no
                   4786:        need to call this function directly.
                   4787:        
                   4788:        long smb_fallochdr(ulong length)
                   4789:        --------------------------------
                   4790:        The smb_fallochdr() function works exactly the same as the smb_allochdr()
                   4791:        function except it is much faster because the header allocation file is not
                   4792:        searched for free blocks. The function is called from smb_addmsghdr(), so you
                   4793:        probably have no need to call this function directly.
                   4794:        
                   4795:        long smb_hallochdr(ulong header_offset)
                   4796:        ---------------------------------------
                   4797:        This smb_hallochdr() functions works exactly the same as the smb_fallochdr()
                   4798:        function except the status.header_offset is passed as the argument and the
                   4799:        header allocation (.SHA) file is not updated so smb_open_ha() need not be
                   4800:        called. The function is called from smb_addmsghdr(), so you probably have no
                   4801:        need to call this function directly.
                   4802:        
                   4803:        long smb_allocdat(ulong length, ushort headers)
                   4804:        -----------------------------------------------
                   4805:        The smb_allocdat() function is used to search for free blocks to store length
                   4806:        amount of data for a message. The parameter headers, indicates the number of
                   4807:        message headers that are associated with this data. Normally, the headers
                   4808:        parameter will be 1, unless this message is part of a mass mailing. The offset
                   4809:        to the allocated data blocks is returned, or a negative value on error. The
                   4810:        function smb_open_da() should be called prior to calling this function and
                   4811:        fclose(sda_fp) should be called after.
                   4812:        
                   4813:        long smb_fallocdat(ulong length, ushort headers)
                   4814:        ------------------------------------------------
                   4815:        The smb_fallocdat() function works exactly the same as the smb_allocdat()
                   4816:        function except it is much faster because the data allocation file is not
                   4817:        searched for free blocks.
                   4818:        
                   4819:        long smb_hallocdat()
                   4820:        --------------------
                   4821:        The smb_hallocdat() function works exactly the same as the smb_hallocdat()
                   4822:        function except no argument is passed and the data allocation file (.SDA) is
                   4823:        not updated so smb_open_da() need not be called.
                   4824: 
                   4825: 
                   4826: 
                   4827: 
                   4828: 
                   4829: 
                   4830: 
                   4831: 
                   4832: 
                   4833:        _______________________________________________________________________________
                   4834:        Synchronet                           82                                SMBLIB.C
                   4835: 
                   4836: 
                   4837:        int smb_incdat(ulong offset, ulong length, ushort headers)
                   4838:        ----------------------------------------------------------
                   4839:        The smb_incdat() function is used to increment the header counter in the data
                   4840:        allocation file for the data starting at the byte offset and length size in
                   4841:        bytes. The parameter headers, indicates the number of headers to add to the
                   4842:        current allocation value in the data allocation file. Returns 0 on success,
                   4843:        non-zero on failure.
                   4844:        
                   4845:        int smb_freemsg(smbmsg_t msg, smbstatus_t status)
                   4846:        -------------------------------------------------
                   4847:        The smb_freemsg() function is used to free the disk space allocated for the
                   4848:        header and data fields of the message msg. Returns 0 on success, non-zero on
                   4849:        failure. The parameter, status, must be the current status from the message
                   4850:        base header for this message base.
                   4851:        
                   4852:        int smb_freemsgdat(ulong offset, ulong length, ushort headers)
                   4853:        --------------------------------------------------------------
                   4854:        The smb_freemsgdat() function is used to decrement the data block allocation
                   4855:        records in the data allocation file associated with the data in the data file
                   4856:        by the value of the headers parameter (normally 1). The parameter offset
                   4857:        indicates the byte offset to the beginning of the message data in the data
                   4858:        file and the parameter length is the total length of the message data.
                   4859:        Returns 0 on success, non-zero on failure.
                   4860:        
                   4861:        int smb_freemsghdr(ulong offset, ulong length)
                   4862:        ----------------------------------------------
                   4863:        The smb_freemsghdr() function is used to set the header block allocation
                   4864:        records in the header allocation file to 0 (indicated non-allocated block).
                   4865:        The parameter offset indicates the byte offset to the beginning of the header
                   4866:        record being freed and the parameter length indicates the total length of the
                   4867:        header record. Returns 0 on success, non-zero on failure.
                   4868:        
                   4869:        int smb_stack(int op)
                   4870:        ---------------------
                   4871:        The smb_stack() function is used to save and restore message base information
                   4872:        so that multiple message bases can be open simultaneously. The stack can
                   4873:        save up to 4 message bases (allowing 5 simultaneously open message bases).
                   4874:        The stack is a "last in, first out" storage area for open message bases.
                   4875:        If the op parameter is SMB_STACK_PUSH, smb_stack() will save (push) the current
                   4876:        message base onto the stack. Calling smb_stack(SMB_STACK_POP) will restore
                   4877:        (pop) the most recently pushed message base off the stack. Calling
                   4878:        smb_stack(SMB_STACK_XCHNG) will exchange the most recently pushed message base
                   4879:        and the current message base (replacing the top of the stack with the current
                   4880:        message base).
                   4881:        
                   4882:        void smb_close()
                   4883:        ----------------
                   4884:        Closes the header, data, and index files for the currently open message base.
                   4885:        
                   4886: 
                   4887: 
                   4888: 
                   4889: 
                   4890: 
                   4891: 
                   4892:        _______________________________________________________________________________
                   4893:        Synchronet                           83                                SMBLIB.C
                   4894: 
                   4895: 
                   4896:        Miscellaneous SMBLIB Files
                   4897:        ==========================
                   4898:        
                   4899:        CRC32.H         C header file for CRC-32 calculations
                   4900:        -----------------------------------------------------
                   4901:        This file contains a static 32-bit CRC table (crc32tbl[]) and a macro (ucrc32)
                   4902:        that uses this table to calculate 32-bit CRCs one byte at a time.
                   4903:        
                   4904:        Example:
                   4905:        
                   4906:            ulong crc=0xffffffff;
                   4907:        
                   4908:        for(i=0;i<length;i++)
                   4909:            crc=ucrc32(buf[i],crc);
                   4910:        crc=~crc;
                   4911:        
                   4912:        
                   4913:        CRC16.C         C functions for 16-bit CRC calculations
                   4914:        -------------------------------------------------------
                   4915:        This file contains a function (ucrc16), to calculate 16-bit CRCs one byte at a
                   4916:        time and a function (crc16) that uses the ucrc16() function to calculate the
                   4917:        16-bit CRC of an ASCIIZ character string.
                   4918:        
                   4919:        Example:
                   4920:        
                   4921:            ushort crc;
                   4922:        
                   4923:        crc=crc16("Text");
                   4924: 
                   4925: 
                   4926: 
                   4927: 
                   4928: 
                   4929: 
                   4930: 
                   4931: 
                   4932: 
                   4933: 
                   4934: 
                   4935: 
                   4936: 
                   4937: 
                   4938: 
                   4939: 
                   4940: 
                   4941: 
                   4942: 
                   4943: 
                   4944: 
                   4945: 
                   4946: 
                   4947: 
                   4948: 
                   4949: 
                   4950: 
                   4951:        _______________________________________________________________________________
                   4952:        Synchronet                           84              Miscellaneous SMBLIB Files
                   4953: 
                   4954: 
                   4955:        LZH.H           Function prototypes for LZH.C
                   4956:        ---------------------------------------------
                   4957:        This file contains function prototypes for the two most important functions
                   4958:        in LZH.C, lzh_encode() and lzh_decode().
                   4959:        
                   4960:        Example:
                   4961:        
                   4962:            uchar str[256],lzh[512];
                   4963:            long length;
                   4964:        
                   4965:        strcpy(str,"This is a string of text");
                   4966:        length=lzh_encode(str,strlen(str),lzh);
                   4967:        lzh_decode(lzh,length,str);
                   4968:        
                   4969:        
                   4970:        LZH.C           C functions for LZH encoding (compression/decompression)
                   4971:        ------------------------------------------------------------------------
                   4972:        This file contains the functions for encoding and decoding LZH compressed
                   4973:        data. If the macro LZH_DYNAMIC_BUF is defined when this file is compiled,
                   4974:        temporary buffers will be dynamically allocated as opposed to static. This
                   4975:        may be slower than the static buffer method, but frees the allocated memory
                   4976:        after encoding or decoding. If free memory for your application is an issue,
                   4977:        then define this macro when compiling this file.
                   4978:        
                   4979:        Example (Borland C):
                   4980:        
                   4981:        bcc -c -DLZH_DYNAMIC_BUF lzh
                   4982:        
                   4983:        Example (Watcom C):
                   4984:        
                   4985:        wcc -dLZH_DYNAMIC_BUF lzh
                   4986: 
                   4987: 
                   4988: 
                   4989: 
                   4990: 
                   4991: 
                   4992: 
                   4993: 
                   4994: 
                   4995: 
                   4996: 
                   4997: 
                   4998: 
                   4999: 
                   5000: 
                   5001: 
                   5002: 
                   5003: 
                   5004: 
                   5005: 
                   5006: 
                   5007: 
                   5008: 
                   5009: 
                   5010:        _______________________________________________________________________________
                   5011:        Synchronet                           85              Miscellaneous SMBLIB Files
                   5012: 
                   5013: 
                   5014:        SMBLIB Storage Example
                   5015:        ======================
                   5016:        
                   5017:        #include "smblib.h"
                   5018:        #include "crc16.c"
                   5019:        
                   5020:        int main(void)
                   5021:        {
                   5022:            char    str[256]                        // General purpose string
                   5023:                   ,*msg_text="Hello, world!"       // Message text
                   5024:                   ,nul_buf[SDT_BLOCK_LEN]={0}      // NULL initialized buffer
                   5025:                   ;
                   5026:            int     i                               // General purpose integer
                   5027:                   ,storage=SMB_SELFPACK            // Default storage method
                   5028:                   ,retry=10                        // Retry for opening/locking files
                   5029:                   ;
                   5030:            ushort  max_age=0                       // Default maximum age of messages
                   5031:                   ,xlat=XLAT_NONE                  // Translation string
                   5032:                   ,tzone=PST                       // Time zone
                   5033:                   ,copies=1                        // Number of copies of this msg
                   5034:                   ;
                   5035:            ulong   max_msgs=500                    // Default max number of msgs
                   5036:                   ,max_crcs=0                      // Default max crcs
                   5037:                   ,length                          // Length of msg text
                   5038:                   ,offset                          // Offset to msg text in data file
                   5039:                   ;
                   5040:            smbmsg_t    msg;                        // Message structure
                   5041:            smbstatus_t status;                     // Message base status record
                   5042:        
                   5043:        strcpy(smb_file,"MSGBASE");                 // We'll use "MSGBASE" for the name
                   5044:        if((i=smb_open(retry))!=0) {                // Can't open!?!
                   5045:            printf("smb_open returned %d\n",i);
                   5046:            return(1); }
                   5047:        
                   5048:        if(!filelength(fileno(shd_fp)))             // Message base not created yet
                   5049:            smb_create(max_crcs                     // Create with default settings
                   5050:                      ,max_msgs
                   5051:                      ,max_age
                   5052:                      ,storage==SMB_HYPERALLOC
                   5053:                            ? SMB_HYPERALLOC : 0    // SMB_EMAIL if this was e-mail
                   5054:                      ,retry
                   5055:                      );
                   5056:        
                   5057:        if((i=smb_locksmbhdr(retry))!=0) {          // Can't lock status base header
                   5058:            printf("smb_locksmbhdr returned %d\n",i);
                   5059:            smb_close();
                   5060:            return(1); }
                   5061:        
                   5062:        if((i=smb_getstatus(&status))!=0) {         // Can't read status base header
                   5063:            smb_unlocksmbhdr();
                   5064:            smb_close();
                   5065:            printf("smb_getstatus returned %d\n",i);
                   5066:            return(1); }
                   5067: 
                   5068: 
                   5069:        _______________________________________________________________________________
                   5070:        Synchronet                           86                  SMBLIB Storage Example
                   5071: 
                   5072: 
                   5073:        if(status.attr&SMB_HYPERALLOC)
                   5074:            storage=SMB_HYPERALLOC;
                   5075:        else
                   5076:            storage=SMB_SELFPACK;
                   5077:        
                   5078:        length=strlen(msg_text);                    // Get length of message
                   5079:        length+=sizeof(xlat);                       // Add length of xlat string
                   5080:        
                   5081:        if(storage==SMB_HYPERALLOC)                 // Allocate space for message text
                   5082:            offset=smb_hallocdat();
                   5083:        else {
                   5084:            if((i=smb_open_da(retry))!=0) {
                   5085:                smb_unlocksmbhdr();
                   5086:                printf("smb_open_da returned %d\n",i);
                   5087:                smb_close();
                   5088:                return(1); }
                   5089:            if(storage==SMB_FASTALLOC)
                   5090:                offset=smb_fallocdat(length,copies);
                   5091:            else
                   5092:                offset=smb_allocdat(length,copies);
                   5093:            fclose(sda_fp); }
                   5094:        
                   5095:        fseek(sdt_fp,offset,SEEK_SET);              // Seek to beginning of data block
                   5096:        fwrite(&xlat,sizeof(xlat),1,sdt_fp);        // Write xlat string
                   5097:        fwrite(msg_text,strlen(msg_text),1,sdt_fp); // Write message text
                   5098:        fwrite(nul_buf,SDT_BLOCK_LEN-length         // Write NULLs out to end of block
                   5099:            ,1,sdt_fp);
                   5100:        fflush(sdt_fp);                             // Flush output buffer
                   5101:        smb_unlocksmbhdr();                         // Unlock status base header
                   5102:        
                   5103:        memset(&msg,0,sizeof(smbmsg_t));            // Initialize header to NULL
                   5104:        memcpy(msg.hdr.id,"SHD\x1a",4);             // Always set to SHD^Z
                   5105:        msg.hdr.version=SMB_VERSION;
                   5106:        msg.hdr.when_written.time=time(NULL);
                   5107:        msg.hdr.when_written.zone=tzone;
                   5108:        msg.hdr.when_imported.time=time(NULL);
                   5109:        msg.hdr.when_imported.zone=tzone;
                   5110:        msg.hdr.offset=offset;
                   5111:        
                   5112:        strcpy(str,"All");                          // Send message to "All"
                   5113:        if((i=smb_hfield(&msg,RECIPIENT,strlen(str),str))!=0) {
                   5114:            printf("smb_hfield returned %d\n",i);
                   5115:            smb_freemsgdat(offset,length,copies);
                   5116:            smb_close();
                   5117:            return(1); }
                   5118:        strlwr(str);                                // If this were e-mail, idx.to
                   5119:        msg.idx.to=crc16(str);                      // would be the "to" user number
                   5120: 
                   5121: 
                   5122: 
                   5123: 
                   5124: 
                   5125: 
                   5126: 
                   5127: 
                   5128:        _______________________________________________________________________________
                   5129:        Synchronet                           87                  SMBLIB Storage Example
                   5130: 
                   5131: 
                   5132:        strcpy(str,"Sysop");                        // Send message from "Sysop"
                   5133:        if((i=smb_hfield(&msg,SENDER,strlen(str),str))!=0) {
                   5134:            printf("smb_hfield returned %d\n",i);
                   5135:            smb_freemsgdat(offset,length,copies);
                   5136:            smb_freemsgmem(msg);
                   5137:            smb_close();
                   5138:            return(1); }
                   5139:        strlwr(str);                                // If this were e-mail, idx.from
                   5140:        msg.idx.from=crc16(str);                    // would be the "from" user number
                   5141:        
                   5142:        strcpy(str,"This is a test");               // Set the message subject/title
                   5143:        if((i=smb_hfield(&msg,SUBJECT,strlen(str),str))!=0) {
                   5144:            printf("smb_hfield returned %d\n",i);
                   5145:            smb_freemsgdat(offset,length,copies);
                   5146:            smb_freemsgmem(msg);
                   5147:            smb_close();
                   5148:            return(1); }
                   5149:        strlwr(str);
                   5150:        msg.idx.subj=crc16(str);
                   5151:        
                   5152:        if((i=smb_dfield(&msg,TEXT_BODY,length))!=0) {
                   5153:            printf("smb_dfield returned %d\n",i);
                   5154:            smb_freemsgdat(offset,length,copies);
                   5155:            smb_freemsgmem(msg);
                   5156:            smb_close();
                   5157:            return(1); }
                   5158:        
                   5159:        if((i=smb_addmsghdr(&msg,&status,storage,retry))!=0) {
                   5160:            printf("smb_addmsghdr returned %d\n",i);
                   5161:            smb_freemsgdat(offset,length,copies);
                   5162:            smb_freemsgmem(msg);
                   5163:            smb_close();
                   5164:            return(1); }
                   5165:        
                   5166:        smb_freemsgmem(msg);                        // Unnecessary if exiting main()
                   5167:        smb_close();                                // Unnecessary if exiting main()
                   5168:        return(0);
                   5169:        }
                   5170: 
                   5171: 
                   5172: 
                   5173: 
                   5174: 
                   5175: 
                   5176: 
                   5177: 
                   5178: 
                   5179: 
                   5180: 
                   5181: 
                   5182: 
                   5183: 
                   5184: 
                   5185: 
                   5186: 
                   5187:        _______________________________________________________________________________
                   5188:        Synchronet                           88                  SMBLIB Storage Example
                   5189: 
                   5190: 
                   5191:        SMBLIB Retrieval Example
                   5192:        ========================
                   5193:        
                   5194:        #include "smblib.h"
                   5195:        
                   5196:        int main(void)
                   5197:        {
                   5198:            char        ch;                         // General purpose character
                   5199:            int         i,                          // General purpose integer
                   5200:                        retry=10;                   // Retry for opening/locking files
                   5201:            ushort      xlat;                       // Translation string
                   5202:            ulong       l;                          // General purpose long integer
                   5203:            smbmsg_t    msg;                        // Message structure
                   5204:        
                   5205:        strcpy(smb_file,"MSGBASE");                 // We'll use "MSGBASE" for the name
                   5206:        if((i=smb_open(retry))!=0) {                // Can't open!?!
                   5207:            printf("smb_open returned %d\n",i);
                   5208:            return(1); }
                   5209:        
                   5210:        if(!filelength(fileno(shd_fp))) {           // Message base not created yet
                   5211:            printf("Empty\n");
                   5212:            smb_close();
                   5213:            return(0); }
                   5214:        
                   5215:        for(msg.offset=0;!ferror(sid_fp);msg.offset++) {
                   5216:        
                   5217:            fseek(sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET);
                   5218:            if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp))
                   5219:                break;
                   5220:        
                   5221:            if((i=smb_lockmsghdr(msg,retry))!=0) {
                   5222:                printf("smb_lockmsghdr returned %d\n",i);
                   5223:                break; }
                   5224:            if((i=smb_getmsghdr(&msg))!=0) {
                   5225:                smb_unlockmsghdr(msg);
                   5226:                printf("smb_getmsghdr returned %d\n",i);
                   5227:                break; }
                   5228:            if((i=smb_unlockmsghdr(msg))!=0) {
                   5229:                smb_freemsgmem(msg);
                   5230:                printf("smb_unlockmsghdr returned %d\n",i);
                   5231:                break; }
                   5232: 
                   5233: 
                   5234: 
                   5235: 
                   5236: 
                   5237: 
                   5238: 
                   5239: 
                   5240: 
                   5241: 
                   5242: 
                   5243: 
                   5244: 
                   5245: 
                   5246:        _______________________________________________________________________________
                   5247:        Synchronet                           89                SMBLIB Retrieval Example
                   5248: 
                   5249: 
                   5250:            printf("Subj : %s\n",msg.subj);
                   5251:            printf("To   : %s\n",msg.to);
                   5252:            printf("From : %s\n",msg.from);
                   5253:            printf("Date : %s\n",ctime((time_t *)&msg.hdr.when_written.time));
                   5254:        
                   5255:            for(i=0;i<msg.hdr.total_dfields;i++)
                   5256:                switch(msg.dfield[i].type) {
                   5257:                    case TEXT_BODY:             // Only show BODY and TAIL data fields
                   5258:                    case TEXT_TAIL:
                   5259:                        fseek(sdt_fp,msg.hdr.offset+msg.dfield[i].offset
                   5260:                            ,SEEK_SET);
                   5261:                        fread(&xlat,sizeof(xlat),1,sdt_fp);
                   5262:                        if(xlat!=XLAT_NONE)     // No translations supported
                   5263:                            continue;
                   5264:                        for(l=sizeof(xlat);l<msg.dfield[i].length;l++) {
                   5265:                            ch=fgetc(sdt_fp);
                   5266:                            if(ch)
                   5267:                                putchar(ch); }
                   5268:                        printf("\n");
                   5269:                        break; }
                   5270:            printf("\n");
                   5271:        
                   5272:            smb_freemsgmem(msg); }          // Free memory allocated by smb_getmsghdr()
                   5273:        
                   5274:        smb_close();
                   5275:        return(0);
                   5276:        }
                   5277: 
                   5278: 
                   5279: 
                   5280: 
                   5281: 
                   5282: 
                   5283: 
                   5284: 
                   5285: 
                   5286: 
                   5287: 
                   5288: 
                   5289: 
                   5290: 
                   5291: 
                   5292: 
                   5293: 
                   5294: 
                   5295: 
                   5296: 
                   5297: 
                   5298: 
                   5299: 
                   5300: 
                   5301: 
                   5302: 
                   5303: 
                   5304: 
                   5305:        _______________________________________________________________________________
                   5306:        Synchronet                           90                SMBLIB Retrieval Example
                   5307: 
                   5308: 
                   5309:        SMBLIB Performance Issues
                   5310:        =========================
                   5311:        
                   5312:        Since importing messages is the usually the most time consuming task likely
                   5313:        undertaken by an SMB application, it is also the most susceptable to design
                   5314:        issues that effect performance.
                   5315:        
                   5316:        Opening and Closing
                   5317:        -------------------
                   5318:        When importing multiple messages for a single message base, it appears logical
                   5319:        to open the message base, import all the messages, then close it. This indeed
                   5320:        is preferred over opening and closing the message base for each message.
                   5321:        
                   5322:        When importing multiple messages for possibly non-consecutive message bases,
                   5323:        developers may eaily make the mistake of opening and closing the message base
                   5324:        for each message. This is not necessary and can considerably hinder the
                   5325:        import performance. The easiest solution is to only close the message base and
                   5326:        open a new one if the next message to be imported is not for the same message
                   5327:        base as the previously imported message. Example:
                   5328:        
                   5329:        smb_file[0]=0;
                   5330:        for(i=0;i<total_messages_to_be_imported;i++) {
                   5331:            if(stricmp(get_messagebase_for_this_message(i),smb_file)) {
                   5332:                if(smb_file[0])     /* We've already opened one */
                   5333:                    smb_close();
                   5334:                strcpy(smb_file,get_messagebase_for_this_message(i));
                   5335:                smb_open(10); }
                   5336:            /* Import this message */
                   5337:            }
                   5338:        if(smb_file[0])
                   5339:            smb_close();
                   5340: 
                   5341: 
                   5342: 
                   5343: 
                   5344: 
                   5345: 
                   5346: 
                   5347: 
                   5348: 
                   5349: 
                   5350: 
                   5351: 
                   5352: 
                   5353: 
                   5354: 
                   5355: 
                   5356: 
                   5357: 
                   5358: 
                   5359: 
                   5360: 
                   5361: 
                   5362: 
                   5363: 
                   5364:        _______________________________________________________________________________
                   5365:        Synchronet                           91               SMBLIB Performance Issues
                   5366: 
                   5367: 
                   5368:        A more advanced method is to keep multiple message bases open at the same time.
                   5369:        Due to the likely limitation of total file handles on the system, it is
                   5370:        suggested to keep the number of simultaneously open message bases at or below
                   5371:        3. SMBLIB includes the function smb_stack() to easily "push" and "pop" message
                   5372:        bases without closing them (push is the equivalent to "save" and pop is the
                   5373:        equivalent to "restore"). The downside of this function is that you cannot
                   5374:        access message bases on the stack without actually popping them off (in reverse
                   5375:        of the order they were pushed). You can however "exchange" the current message
                   5376:        base with the message base on the top of the stack (most recently pushed).
                   5377:        To intelligently juggle more than two open message bases, the developer should
                   5378:        create their own equivalent of the smb_stack() function so they can access the
                   5379:        message bases on the stack without popping them off. An example of keeping a
                   5380:        maximum of two message bases open using smb_stack():
                   5381:        
                   5382:            char last_messagebase[128],new_messagebase[128];
                   5383:        
                   5384:        smb_file[0]=0;
                   5385:        last_messagebase[0]=0;
                   5386:        for(i=0;i<total_messages_to_be_imported;i++) {
                   5387:            strcpy(new_messagebase,get_messagebase_for_this_message(i));
                   5388:            if(stricmp(new_messagebase,smb_file)) {     /* Not current message base */
                   5389:                if(smb_file[0]) {                       /* We've already opened one */
                   5390:                    if(!stricmp(new_messagebase,last_messagebase)) { /* Same as last */
                   5391:                        strcpy(last_messagebase,smb_file);
                   5392:                        smb_stack(SMB_STACK_XCHNG); }       /* Retore previous base */
                   5393:                    else {
                   5394:                        if(last_messagebase[0]) {
                   5395:                            smb_stack(SMB_STACK_XCHNG);
                   5396:                            smb_close();
                   5397:                            strcpy(last_messagebase,new_messagebase); }
                   5398:                        else {
                   5399:                            strcpy(last_messagebase,smb_file);
                   5400:                            smb_stack(SMB_STACK_PUSH); }    /* Save current base */
                   5401:                        strcpy(smb_file,new_messagebase);
                   5402:                        smb_open(10); } }
                   5403:                else {
                   5404:                    strcpy(smb_file,new_messagebase);
                   5405:                    smb_open(10); } }
                   5406:            /* Import this message */
                   5407:            }
                   5408:        if(smb_file[0])
                   5409:            smb_close();
                   5410:        if(last_messagebase[0]) {
                   5411:            smb_stack(SMB_STACK_POP);
                   5412:            smb_close(); }
                   5413: 
                   5414: 
                   5415: 
                   5416: 
                   5417: 
                   5418: 
                   5419: 
                   5420: 
                   5421: 
                   5422: 
                   5423:        _______________________________________________________________________________
                   5424:        Synchronet                           92               SMBLIB Performance Issues
                   5425: 
                   5426: 
                   5427:        The second example would be of negligible performance gain over the first
                   5428:        example (6 open operations versus 7) if the messages to import were in the
                   5429:        following order:
                   5430:        
                   5431:        msg[0] --> msgbase[0]       // 0 opened
                   5432:        msg[1] --> msgbase[1]       // 0 pushed 1 opened
                   5433:        msg[2] --> msgbase[1]
                   5434:        msg[3] --> msgbase[2]       // 1 closed 0 popped 0 closed 2 opened
                   5435:        msg[4] --> msgbase[0]       // 2 pushed 0 opened
                   5436:        msg[5] --> msgbase[2]       // 0 pushed 2 popped (exchanged)
                   5437:        msg[6] --> msgbase[3]       // 2 closed 0 popped 0 closed 3 opened
                   5438:        msg[7] --> msgbase[0]       // 3 pushed 0 opened
                   5439:        
                   5440:        The second example would be of significant performance gain over the first
                   5441:        example (4 open operations versus 8) if the messages to import were in the
                   5442:        following order:
                   5443:        
                   5444:        msg[0] --> msgbase[0]       // 0 opened
                   5445:        msg[1] --> msgbase[1]       // 0 pushed 1 opened
                   5446:        msg[2] --> msgbase[0]       // 1 pushed 0 popped (exchanged)
                   5447:        msg[3] --> msgbase[1]       // 0 pushed 1 popped (exchanged)
                   5448:        msg[4] --> msgbase[0]       // 1 pushed 0 popped (exchanged)
                   5449:        msg[5] --> msgbase[2]       // 0 pushed 1 popped (exchanged) 1 closed 2 opened
                   5450:        msg[6] --> msgbase[3]       // 2 pushed 0 popped (exchanged) 0 closed 3 opened
                   5451:        msg[7] --> msgbase[2]       // 3 pushed 2 popped (exchanged)
                   5452:        
                   5453:        More advanced use of "stack-like" message base file handle storage can easily
                   5454:        reduce the number of open operations, therefore increasing import performance
                   5455:        under more adverse message base ordering conditions.
                   5456: 
                   5457: 
                   5458: 
                   5459: 
                   5460: 
                   5461: 
                   5462: 
                   5463: 
                   5464: 
                   5465: 
                   5466: 
                   5467: 
                   5468: 
                   5469: 
                   5470: 
                   5471: 
                   5472: 
                   5473: 
                   5474: 
                   5475: 
                   5476: 
                   5477: 
                   5478: 
                   5479: 
                   5480: 
                   5481: 
                   5482:        _______________________________________________________________________________
                   5483:        Synchronet                           93               SMBLIB Performance Issues
                   5484: 
                   5485: 
                   5486:        Compression
                   5487:        -----------
                   5488:        If any message data compression features are offered by the application, it
                   5489:        is important the the application not unnecessarily compress data that will
                   5490:        not save any storage space. While this may seem an obvious statement, please
                   5491:        review the following pseudo-code example:
                   5492:        
                   5493:        if ( message_data_length < SDT_BLOCK_LEN )
                   5494:            // Store uncompressed data
                   5495:        else {
                   5496:            // Compress data
                   5497:            if ( ( compressed_data_length / SDT_BLOCK_LEN )
                   5498:                < ( message_data_length / SDT_BLOCK_LEN ) ) // Saves a block or more
                   5499:                // Store compressed data
                   5500:            else
                   5501:                // Store uncompressed data
                   5502:            }
                   5503:        
                   5504:        Since the SMB format stores message data in fixed length blocks, there is no
                   5505:        point in storing a message in compressed format if it requires the same number
                   5506:        of blocks as the uncompressed format (i.e. a message that is two blocks in
                   5507:        length in uncompressed format and only a block and a half in length when
                   5508:        compressed should not be stored in compressed format since it still requires
                   5509:        two full blocks of storage). It is important to note that in the above example,
                   5510:        the length of the data translation string was not taken into account in
                   5511:        determining the number of required blocks. Also, the smb_datblocks() function
                   5512:        is normally used in determing the number of required blocks to store a given
                   5513:        data length and it is a little more involved than simply dividing the length of
                   5514:        the data by SDT_BLOCK_LEN.
                   5515:        
                   5516: 
                   5517: 
                   5518: 
                   5519: 
                   5520: 
                   5521: 
                   5522: 
                   5523: 
                   5524: 
                   5525: 
                   5526: 
                   5527: 
                   5528: 
                   5529: 
                   5530: 
                   5531: 
                   5532: 
                   5533: 
                   5534: 
                   5535: 
                   5536: 
                   5537: 
                   5538: 
                   5539: 
                   5540: 
                   5541:        _______________________________________________________________________________
                   5542:        Synchronet                           94               SMBLIB Performance Issues
                   5543: 
                   5544: 
                   5545:        Bibliography
                   5546:        ============
                   5547:        
                   5548:        Title     : The C Programming Language
                   5549:        Publisher : Prentice Hall
                   5550:        Author    : Brian W. Kernighan and Dennis M. Ritchie
                   5551:        
                   5552:        Document  : ARPANET Request for Comments (RFC) #822
                   5553:        Title     : Standard for the Format of ARPA Internet text messages
                   5554:        Publisher : SRI International
                   5555:        Author    : David H. Crocker, University of Delaware
                   5556:        
                   5557:        Document  : FTS-0001
                   5558:        Publisher : FSC
                   5559:        Author    : Randy Bush, Pacific Systems Group
                   5560:        
                   5561:        Document  : FTS-0004
                   5562:        Title     : EchoMail Specification
                   5563:        Publisher : FSC
                   5564:        Author    : Bob Hartman
                   5565:        
                   5566:        Document  : FTS-0009
                   5567:        Title     : A standard for unique message identifiers and reply chain linkage
                   5568:        Publisher : FSC
                   5569:        Author    : Jim Nutt
                   5570:        
                   5571:        Document  : FSC-00046
                   5572:        Title     : A Product Idenfifier for FidoNet Message Handlers
                   5573:        Publisher : FSC
                   5574:        Author    : Joaquim H. Homrighausen
                   5575:        
                   5576:        Document  : FSC-00053
                   5577:        Title     : Specifications for the ^aFLAGS field
                   5578:        Publisher : FSC
                   5579:        Author    : Joaquim H. Homrighausen
                   5580:        
                   5581: 
                   5582: 
                   5583: 
                   5584: 
                   5585: 
                   5586: 
                   5587: 
                   5588: 
                   5589: 
                   5590: 
                   5591: 
                   5592: 
                   5593: 
                   5594: 
                   5595: 
                   5596: 
                   5597: 
                   5598: 
                   5599: 
                   5600:        _______________________________________________________________________________
                   5601:        Synchronet                           95                            Bibliography
                   5602: 
                   5603: 
                   5604:        Implementations
                   5605:        ===============
                   5606:        
                   5607:        Product   : Synchronet Multinode BBS Software
                   5608:        Developer : Digital Dynamics
                   5609:        Level     : III
                   5610:        Version   : 2.20
                   5611:        
                   5612:        Product   : Synchronet/FidoNet Import/Export Utility (SBBSFIDO)
                   5613:        Developer : Digital Dynamics
                   5614:        Level     : III
                   5615:        Version   : 2.23
                   5616:        
                   5617:        Product   : Synchronet UTI (Universal Text Interface) Driver
                   5618:        Developer : Digital Dynamics
                   5619:        Level     : III
                   5620:        Version   : 2.23
                   5621:        
                   5622:        Product   : SBBSecho FidoNet Packet Tosser for Synchronet
                   5623:        Developer : Digital Dynamics
                   5624:        Level     : III
                   5625:        Version   : 1.11
                   5626:        
                   5627:        Product   : NetXpress Internet UUCP for Synchronet
                   5628:        Developer : Merlin Systems
                   5629:        Level     : II
                   5630:        Version   : 1.50
                   5631:        
                   5632:        Product   : InterEcho FidoNet Packet Tosser
                   5633:        Developer : InterMail Sales Inc
                   5634:        Level     : II
                   5635:        Version   : 1.11
                   5636: 
                   5637: 
                   5638: 
                   5639: 
                   5640: 
                   5641: 
                   5642: 
                   5643: 
                   5644: 
                   5645: 
                   5646: 
                   5647: 
                   5648: 
                   5649: 
                   5650: 
                   5651: 
                   5652: 
                   5653: 
                   5654: 
                   5655: 
                   5656: 
                   5657: 
                   5658:        _______________________________________________________________________________
                   5659:        Synchronet                           96                                   Index
                   5660: 
                   5661: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.