Documentation
¶
Overview ¶
Package archivetest builds small RAR 4.x / RAR 5.0 archives (and Copy-mode 7z archives) for tests. It is for tests only: production code must not import it.
The archives are structurally valid with correct header CRCs. File data is written verbatim: Method, Encrypted and Solid only set the corresponding header flags (nothing is compressed or encrypted), which is all a header parser can observe.
Index ¶
- Constants
- Variables
- func Build7zCopy(files []SevenZipFile, solid bool) []byte
- func BuildRAR(files []RARFile, opts RAROptions) ([][]byte, error)
- func Number7z(v uint64) []byte
- func RAR4Block(typ byte, flags uint16, body []byte) []byte
- func RAR4EncodeName(name string) ([]byte, bool)
- func RAR4EndHeader(more bool, volNum int) []byte
- func RAR4FileHeader(h Header) []byte
- func RAR4MainHeader(flags uint16) []byte
- func RAR5Block(typ, flags uint64, fields, extra []byte, hasData bool, dataSize int64) []byte
- func RAR5EndHeader(more bool) []byte
- func RAR5FileHeader(h Header) []byte
- func RAR5MainHeader(multi bool, volNum int, solid bool) []byte
- func RAR5Record(typ uint64, data []byte) []byte
- func Vint(v uint64) []byte
- type Header
- type RARFile
- type RAROptions
- type SevenZipFile
Constants ¶
const ( // RAR 4.x main header flags (for RAR4MainHeader). RAR4MainVolume = 0x0001 RAR4MainSolid = 0x0008 RAR4MainNewNumbering = 0x0010 RAR4MainPassword = 0x0080 RAR4MainFirstVolume = 0x0100 )
RAR 4.x constants.
Variables ¶
var ( RAR4Signature = []byte("Rar!\x1a\x07\x00") RAR5Signature = []byte("Rar!\x1a\x07\x01\x00") )
Signatures.
var ErrVolumeTooSmall = errors.New("archivetest: volume size too small")
ErrVolumeTooSmall is returned when VolumeSize cannot hold a header.
Functions ¶
func Build7zCopy ¶
func Build7zCopy(files []SevenZipFile, solid bool) []byte
Build7zCopy writes a 7z archive with a plain (unencoded) header whose non-empty files live in Copy folders: one folder holding every file as a substream when solid (7-Zip itself never does that for Copy), else one folder per file.
func BuildRAR ¶
func BuildRAR(files []RARFile, opts RAROptions) ([][]byte, error)
BuildRAR returns the bytes of each volume in order.
func RAR4EncodeName ¶
RAR4EncodeName returns the RAR 4.x name field for name and whether it needs LHD_UNICODE. Non-ASCII names get an OEM fallback, a NUL and RAR's compact UTF-16 encoding (using all four opcodes: run copy, low byte, high-byte page and full 16-bit).
func RAR4EndHeader ¶
RAR4EndHeader returns a RAR 4.x end-of-archive block; volNum < 0 omits the volume number.
func RAR4FileHeader ¶
RAR4FileHeader returns a RAR 4.x file header (or new sub-block if h.Service). Names containing non-ASCII characters are written with RAR's unicode name encoding.
func RAR4MainHeader ¶
RAR4MainHeader returns a RAR 4.x main archive header (RAR4Main* flags).
func RAR5Block ¶
RAR5Block serialises a RAR 5.0 block: CRC32, HeaderSize, type, flags, optional extra-area and data sizes, the type-specific fields and the extra area.
func RAR5EndHeader ¶
RAR5EndHeader returns a RAR 5.0 end-of-archive header.
func RAR5FileHeader ¶
RAR5FileHeader returns a RAR 5.0 file header (or service header if h.Service). A file-time extra record is always present; Encrypted adds a file encryption record.
func RAR5MainHeader ¶
RAR5MainHeader returns a RAR 5.0 main archive header. volNum > 0 writes the volume-number field (absent in the first volume).
func RAR5Record ¶
RAR5Record serialises one extra-area record.
Types ¶
type Header ¶
type Header struct {
Name string
PackSize int64 // data bytes following the header in this volume
UnpackSize int64 // whole-file size
Method int // 0 = store .. 5 (RAR4 writes 0x30+Method)
CRC uint32
SplitBefore bool
SplitAfter bool
Encrypted bool
Solid bool
Dir bool
UnknownSize bool // unpacked size unknown
Large bool // RAR4: write the 64-bit size fields even if not needed
UTF8Name bool // RAR4: set LHD_UNICODE and store the name as plain UTF-8
Service bool // RAR4 new sub-block (0x7a) / RAR5 service header (type 3)
// contains filtered or unexported fields
}
Header describes one RAR file header (a whole file or one volume's part of it) for RAR4FileHeader / RAR5FileHeader.
type RARFile ¶
type RARFile struct {
Name string // '/'-separated; RAR4 writes it as given
Data []byte
Method int // 0 = store; RAR4 writes 0x30+Method
Encrypted bool
Solid bool
Dir bool
UnknownSize bool // header says the unpacked size is unknown
Large bool // RAR4: 64-bit size fields
}
RARFile is one input file for BuildRAR.
type RAROptions ¶
type RAROptions struct {
Version int // 4 or 5 (0 means 5)
// VolumeSize is the size of every volume except the last, like rar -v.
// 0 builds a single (non-volume) archive. Each volume holds headers,
// as much file data as fits, and the end-of-archive block. A volume is
// closed early only when the next file header plus one data byte would
// not fit; a volume ending in a split file is always exactly
// VolumeSize (RAR5 pads the DataSize vint if a vint length step would
// otherwise leave a byte over).
VolumeSize int64
HeaderEncrypted bool // RAR4 MHD_PASSWORD / RAR5 archive encryption header (single volume, garbage after it)
SolidArchive bool // archive-level solid flag
NewNumbering bool // RAR4 MHD_NEWNUMBERING
// OmitEndVolumeNumber leaves EARC_VOLNUMBER out of RAR4 end blocks
// (RAR 3.x+ writes it in volumes).
OmitEndVolumeNumber bool
// ServiceBlocks adds blocks a parser must skip after the main header:
// a comment service header with data, an old-style block (RAR4) or an
// unknown block type (RAR5).
ServiceBlocks bool
OmitEndBlock bool
}
RAROptions controls BuildRAR.
type SevenZipFile ¶
SevenZipFile is one input file for Build7zCopy. Empty Data without Dir is an empty file.