| 1 | //! Archive definitions. | 
| 2 | //! | 
| 3 | //! These definitions are independent of read/write support, although we do implement | 
| 4 | //! some traits useful for those. | 
| 5 |  | 
| 6 | use crate::pod::Pod; | 
| 7 |  | 
| 8 | /// File identification bytes stored at the beginning of the file. | 
| 9 | pub const MAGIC: [u8; 8] = *b"!<arch> \n" ; | 
| 10 |  | 
| 11 | /// File identification bytes at the beginning of AIX big archive. | 
| 12 | pub 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. | 
| 17 | pub const THIN_MAGIC: [u8; 8] = *b"!<thin> \n" ; | 
| 18 |  | 
| 19 | /// The terminator for each archive member header. | 
| 20 | pub 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)] | 
| 25 | pub 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)] | 
| 45 | pub 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)] | 
| 67 | pub 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)] | 
| 89 | pub struct AixMemberOffset(pub [u8; 20]); | 
| 90 |  | 
| 91 | unsafe_impl_pod!(Header, AixHeader, AixFileHeader, AixMemberOffset,); | 
| 92 |  |