object/
archive.rs

1//! Archive definitions.
2//!
3//! These definitions are independent of read/write support, although we do implement
4//! some traits useful for those.
5
6use crate::pod::Pod;
7
8/// File identification bytes stored at the beginning of the file.
9pub const MAGIC: [u8; 8] = *b"!<arch>\n";
10
11/// File identification bytes at the beginning of AIX big archive.
12pub const AIX_BIG_MAGIC: [u8; 8] = *b"<bigaf>\n";
13
14/// File identification bytes stored at the beginning of a thin archive.
15///
16/// A thin archive only contains a symbol table and file names.
17pub const THIN_MAGIC: [u8; 8] = *b"!<thin>\n";
18
19/// The terminator for each archive member header.
20pub const TERMINATOR: [u8; 2] = *b"`\n";
21
22/// The header at the start of an archive member.
23#[derive(Debug, Clone, Copy)]
24#[repr(C)]
25pub struct Header {
26    /// The file name.
27    pub name: [u8; 16],
28    /// File modification timestamp in decimal.
29    pub date: [u8; 12],
30    /// User ID in decimal.
31    pub uid: [u8; 6],
32    /// Group ID in decimal.
33    pub gid: [u8; 6],
34    /// File mode in octal.
35    pub mode: [u8; 8],
36    /// File size in decimal.
37    pub size: [u8; 10],
38    /// Must be equal to `TERMINATOR`.
39    pub terminator: [u8; 2],
40}
41
42/// The header at the start of an AIX big archive member, without name.
43#[derive(Debug, Clone, Copy)]
44#[repr(C)]
45pub struct AixHeader {
46    /// File member size in decimal.
47    pub size: [u8; 20],
48    /// Next member offset in decimal.
49    pub nxtmem: [u8; 20],
50    /// Previous member offset in decimal.
51    pub prvmem: [u8; 20],
52    /// File member date in decimal.
53    pub date: [u8; 12],
54    /// File member user id in decimal.
55    pub uid: [u8; 12],
56    /// File member group id in decimal.
57    pub gid: [u8; 12],
58    /// File member mode in octal.
59    pub mode: [u8; 12],
60    /// File member name length in decimal.
61    pub namlen: [u8; 4],
62}
63
64/// The AIX big archive's fixed length header at file beginning.
65#[derive(Debug, Clone, Copy)]
66#[repr(C)]
67pub struct AixFileHeader {
68    /// Archive magic string.
69    pub magic: [u8; 8],
70    /// Offset of member table.
71    pub memoff: [u8; 20],
72    /// Offset of global symbol table.
73    pub gstoff: [u8; 20],
74    /// Offset of global symbol table for 64-bit objects.
75    pub gst64off: [u8; 20],
76    /// Offset of first member.
77    pub fstmoff: [u8; 20],
78    /// Offset of last member.
79    pub lstmoff: [u8; 20],
80    /// Offset of first member on free list.
81    pub freeoff: [u8; 20],
82}
83
84/// Offset of a member in an AIX big archive.
85///
86/// This is used in the member index.
87#[derive(Debug, Clone, Copy)]
88#[repr(C)]
89pub struct AixMemberOffset(pub [u8; 20]);
90
91unsafe_impl_pod!(Header, AixHeader, AixFileHeader, AixMemberOffset,);