This is an old revision of the document!
Table of Contents
QWK Format
QWK packets and their closely related Reply (REP) packets are single-file archives (usually in PKZIP format) containing one or more data. QWK packets are filenames with a .QWK
suffix/extension, while Reply packet filenames have a .REP
suffix.
QWK File
QWK packets are typically created-on and downloaded-from a large message archive (e.g. a collection of message bases) on a remotely-accessible system (e.g. BBS). The messages contained in the packet may include both private messages (e.g. e-mail) and public messages (e.g. posts on topical conferences). While the private messages are typically addressed *only* to the user that downloaded the QWK packet, the public messages may be addressed to anyone (or often, “All”).
The files that may be contained within a QWK packet (archive) include:
Filename | Standard | Description |
---|---|---|
MESSAGES.DAT | QWK | Binary file containing body text and limited header information for all messages contained in the packet (at minimum, a QWK packet must contain this file) |
HEADERS.DAT | Synchronet | Text file (in .ini file format) containing detailed header information for every message in the packet |
VOTING.DAT | Synchronet | Text file (in .ini file format) containing voting information (polls, ballots, up/down-votes) contained in the packet |
CONTROL.DAT | QWK | CRLF text file containing metadata about the system (BBS) where the messages cam from including the names of the conferences where public messages may have originated |
DOOR.ID | QWK | CRLF text file containing metadata about the software that created the QWK packet |
NETFLAGS.DAT | QWK | Binary file containing a 'net status' indicator (0x00 or 0x01) for each message conference |
NEWFILES.DAT | QWK | CRLF text file containing list of newly added/uploaded files on the system that created the QWK packet |
PERSONAL.NDX | QWK | Binary file containing pointers to messages addressed to the user that created / downloaded the QWK packet |
000.NDX | QWK | Binary file containing pointers to in the mail “inbox” for the user that created / downloaded the QWK packet |
x00y.NDX | QWK | Binary file containing pointers to messages in public message group x, sub-board y |
TOREADER.EXT | QWKE | CRLF text file containing metadata about the user that created / downloaded the QWK packet |
The first 3 files (MESSAGES.DAT
, HEADERS.DAT
, and VOTING.DAT
) are the most important when it comes to Synchronet QWK networking.
MESSAGES.DAT
The MESSAGES.DAT
file (and ID.MSG
file) is written in multiples of 128-byte blocks.
The first 128-byte block in the file contains a space-padded US-ASCII string identifying the software that generated the packet.
fprintf(qwk,"%-128.128s","Produced by " VERSION_NOTICE " " COPYRIGHT_NOTICE);
Conversely, the first 128-byte block of an ID.MSG
file from a .REP
packet contains the QWK-ID of the system for which the packet was created and is intended to be uploaded-to.
- All subsequent 128-byte blocks in the file are either header blocks or body blocks.
- Each header block identifies a unique message in the packet.
- Header blocks are fix length (a single block only).
- Each message has only one corresponding header block.
- A normal message will have at least one body block (at minimum).
- Vote messages (ballots, polls, up/down-votes) will not have a corresponding body block (see
VOTING.DAT
file). - A header block includes an indication of the total number of blocks before the next header block (minimum: 1).
Header Block
ASCII string fields are space-filled and generally left-justified. Unused bytes are generally filled with a space (ASCII 32) character. Multi-byte integer are stored in little-endian byte order (LSB first).
Offset | Length | Format | Description |
---|---|---|---|
0 | 1 | ASCII char | Message status (“* ”, “+ ”, “~ ”, “` ”, “% ”, “^ ”, “# ”, “$ ”, “- ”, “ ”, or “V ”) |
1 | 7 | ASCII string | message number for QWK packets, conference number for REP packets (7 decimal digits) |
8 | 13 | ASCII string | Date and time (“MM-DD-YYHH:MM”) |
21 | 25 | ASCII string | To name |
46 | 25 | ASCII string | From name |
71 | 25 | ASCII string | Subject |
96 | 12 | ASCII string | Password (unused by Synchronet and un-populated by Synchronet) |
108 | 8 | ASCII string | In-reply-to message number (8 decimal digits) |
116 | 6 | ASCII string | Number of blocks for the message, including header block (1+) |
122 | 1 | byte | Message status: 225 = message active, 226 = message deleted |
123 | 2 | uint16 | Conference number |
125 | 2 | uint16 | Relative message number in packet (1+) (unused and not populated by Synchronet) |
127 | 1 | ASCII char | Net tag line (“* ” if present, “ ” otherwise) |
As you may have noticed, the QWK message header block contains some narrow limitations and bizarre inconsistencies. For example:
- Most fields are US-ASCII, while some are binary (little-endian) “words”
- Name (to and from) are limited to 25 characters while standard FidoNet messages support up to to 35-character names
- Message subjects are limited to 25 characters while standard FidoNet messages support up to 71-character message subjects
- The message “password” field doesn't seem to have ever been used by anything, but easily could have been used to extend subjects to 37 characters
- Message dates are limited to 2-digit years
- Message time is in hours and minutes only (no seconds)
- A maximum conference number of 9,999,999 is allowed in the field at offset 1 of a
.MSG
file, while the conference number at offset 123 is limited to just 65535. - The message number at offset 1 of a
MESSAGES.DAT
file is limited to 9,999,999 while the In-reply-to message number (at off 108) can hold a number up to 99,999,999.
All of this craziness is addressed with the Synchronet-defined HEADERS.DAT
file.
Body Block
The text of a message is contained in one or more body blocks which follow the header block. If the message does not fit in an exact-multiple of 128-byte blocks, the last block is filled with spaces or NULLs.
NDX Files
The .NDX
(index) files contained in QWK packets are of a notoriously bad format. These files contain byte offsets into the MESSAGES.DAT
file, which is fine. But these offsets are stored as 32-bit real numbers in an obsolete “Microsoft Binary Format”. Additionally, each record contain a conference number, but that conference number is only 8-bit, limiting its usefulness to only 256 possible message areas.
Some message reader do not require or can be configured to ignore these .NDX
files. There is no unique information stored in the .NDX
files, so it's entirely possible for any consumer of QWK packets to be programmed to create their own useful index information on-the-fly (e.g. the first time the packet is opened).
Synchronet does not parse or use .NDX
files in any way.
NETFLAGS.DAT
The NETFLAGS.DAT
is of questionable usefulness or value. Synchronet creates this file only for QWK packets destined for QWK network nodes (all bytes containing 0x01). Synchronet does not read or use this file from incoming packets.
Bulletin Files
Optional bulletin files (in CRLF text format) may also be found in QWK packets. For example:
Filename | Description |
---|---|
HELLO | Displayed to reader of message packet |
BBSNEWS | Displayed to reader of message packet |
BLT-* | Displayed to reader of message packet |
GOODBYE | Displayed to reader of message packet upon exiting packet |
Additional Files
Other files found in a QWK packet were usually placed there because the user requested them to be included (e.g. from a download queue) or they were attached to messages included in the packet.
REP File
REP (reply) packets are typically created by a user using an offline mail reader or by a system participating as a down-stream node in a message network using QWK packet technology (e.g. DOVE-Net).
The files that may be contained within a Reply packet (archive) include:
Filename | Standard | Description |
---|---|---|
ID.MSG | QWK | Binary file containing replay message (format nearly identical to that of MESSAGES.DAT ). The base filename is the unique QWK-ID of the system where the packet was created / downloaded-from |
HEADERS.DAT | Synchronet | Text file (in .ini file format) containing detailed header information for every message in the packet |
VOTING.DAT | Synchronet | Text file (in .ini file format) containing voting information (polls, ballots, up/down-votes) contained in the packet |
TODOOR.EXT | QWKE | CRLF text file containing control instructions from the offline mail reader to the BBS |