//! Archive definitions. //! //! These definitions are independent of read/write support, although we do implement //! some traits useful for those. use crate::pod::Pod; /// File identification bytes stored at the beginning of the file. pub const MAGIC: [u8; 8] = *b"!\n"; /// File identification bytes at the beginning of AIX big archive. pub const AIX_BIG_MAGIC: [u8; 8] = *b"\n"; /// File identification bytes stored at the beginning of a thin archive. /// /// A thin archive only contains a symbol table and file names. pub const THIN_MAGIC: [u8; 8] = *b"!\n"; /// The terminator for each archive member header. pub const TERMINATOR: [u8; 2] = *b"`\n"; /// The header at the start of an archive member. #[derive(Debug, Clone, Copy)] #[repr(C)] pub struct Header { /// The file name. pub name: [u8; 16], /// File modification timestamp in decimal. pub date: [u8; 12], /// User ID in decimal. pub uid: [u8; 6], /// Group ID in decimal. pub gid: [u8; 6], /// File mode in octal. pub mode: [u8; 8], /// File size in decimal. pub size: [u8; 10], /// Must be equal to `TERMINATOR`. pub terminator: [u8; 2], } /// The header at the start of an AIX big archive member, without name. #[derive(Debug, Clone, Copy)] #[repr(C)] pub struct AixHeader { /// File member size in decimal. pub size: [u8; 20], /// Next member offset in decimal. pub nxtmem: [u8; 20], /// Previous member offset in decimal. pub prvmem: [u8; 20], /// File member date in decimal. pub date: [u8; 12], /// File member user id in decimal. pub uid: [u8; 12], /// File member group id in decimal. pub gid: [u8; 12], /// File member mode in octal. pub mode: [u8; 12], /// File member name length in decimal. pub namlen: [u8; 4], } /// The AIX big archive's fixed length header at file beginning. #[derive(Debug, Clone, Copy)] #[repr(C)] pub struct AixFileHeader { /// Archive magic string. pub magic: [u8; 8], /// Offset of member table. pub memoff: [u8; 20], /// Offset of global symbol table. pub gstoff: [u8; 20], /// Offset of global symbol table for 64-bit objects. pub gst64off: [u8; 20], /// Offset of first member. pub fstmoff: [u8; 20], /// Offset of last member. pub lstmoff: [u8; 20], /// Offset of first member on free list. pub freeoff: [u8; 20], } /// Offset of a member in an AIX big archive. /// /// This is used in the member index. #[derive(Debug, Clone, Copy)] #[repr(C)] pub struct AixMemberOffset(pub [u8; 20]); unsafe_impl_pod!(Header, AixHeader, AixFileHeader, AixMemberOffset,);