|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.