|
|
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.