From 0c750fbdda7b3b5484665aefee4f0c41b32e1647 Mon Sep 17 00:00:00 2001 From: Szymon Walter Date: Sun, 18 Mar 2018 20:35:55 +0100 Subject: [PATCH] move raw packed struct to `sys` module --- src/lib.rs | 10 ++--- src/{ => sys}/block_group.rs | 12 +++--- src/{ => sys}/inode.rs | 42 +++++++++--------- src/sys/mod.rs | 3 ++ src/{ => sys}/superblock.rs | 82 ++++++++++++++++++------------------ 5 files changed, 75 insertions(+), 74 deletions(-) rename src/{ => sys}/block_group.rs (93%) rename src/{ => sys}/inode.rs (88%) create mode 100644 src/sys/mod.rs rename src/{ => sys}/superblock.rs (87%) diff --git a/src/lib.rs b/src/lib.rs index 02ab7a0..deaeaa1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,15 +4,13 @@ extern crate bitflags; pub mod error; -pub mod superblock; -pub mod block_group; -pub mod inode; +pub mod sys; #[cfg(test)] mod tests { - use super::superblock::*; - use super::block_group::*; - use super::inode::*; + use sys::superblock::*; + use sys::block_group::*; + use sys::inode::*; #[test] fn sizes() { diff --git a/src/block_group.rs b/src/sys/block_group.rs similarity index 93% rename from src/block_group.rs rename to src/sys/block_group.rs index 14974e1..eb277b9 100644 --- a/src/block_group.rs +++ b/src/sys/block_group.rs @@ -25,17 +25,17 @@ use error::Error; #[repr(C, packed)] pub struct BlockGroupDescriptor { /// Block address of block usage bitmap - block_usage_addr: u32, + pub block_usage_addr: u32, /// Block address of inode usage bitmap - inode_usage_addr: u32, + pub inode_usage_addr: u32, /// Starting block address of inode table - inode_table_block: u32, + pub inode_table_block: u32, /// Number of unallocated blocks in group - free_blocks_count: u16, + pub free_blocks_count: u16, /// Number of unallocated inodes in group - free_inodes_count: u16, + pub free_inodes_count: u16, /// Number of directories in group - dirs_count: u16, + pub dirs_count: u16, #[doc(hidden)] _reserved: [u8; 14], } diff --git a/src/inode.rs b/src/sys/inode.rs similarity index 88% rename from src/inode.rs rename to src/sys/inode.rs index 1ce8fc7..d5cc47c 100644 --- a/src/inode.rs +++ b/src/sys/inode.rs @@ -8,56 +8,56 @@ #[repr(C, packed)] pub struct Inode { /// Type and Permissions (see below) - type_perm: u16, + pub type_perm: u16, /// User ID - uid: u16, + pub uid: u16, /// Lower 32 bits of size in bytes - size_low: u32, + pub size_low: u32, /// Last Access Time (in POSIX time) - atime: u32, + pub atime: u32, /// Creation Time (in POSIX time) - ctime: u32, + pub ctime: u32, /// Last Modification time (in POSIX time) - mtime: u32, + pub mtime: u32, /// Deletion time (in POSIX time) - dtime: u32, + pub dtime: u32, /// Group ID - gid: u16, + pub gid: u16, /// Count of hard links (directory entries) to this inode. When this /// reaches 0, the data blocks are marked as unallocated. - hard_links: u16, + pub hard_links: u16, /// Count of disk sectors (not Ext2 blocks) in use by this inode, not /// counting the actual inode structure nor directory entries linking /// to the inode. - sectors_count: u32, + pub sectors_count: u32, /// Flags - flags: u32, + pub flags: u32, /// Operating System Specific value #1 - _os_specific_1: u32, + pub _os_specific_1: [u8; 4], /// Direct block pointers - direct_pointer: [u32; 12], + pub direct_pointer: [u32; 12], /// Singly Indirect Block Pointer (Points to a block that is a list of /// block pointers to data) - indirect_pointer: u32, + pub indirect_pointer: u32, /// Doubly Indirect Block Pointer (Points to a block that is a list of /// block pointers to Singly Indirect Blocks) - doubly_indirect: u32, + pub doubly_indirect: u32, /// Triply Indirect Block Pointer (Points to a block that is a list of /// block pointers to Doubly Indirect Blocks) - triply_indirect: u32, + pub triply_indirect: u32, /// Generation number (Primarily used for NFS) - gen_number: u32, + pub gen_number: u32, /// In Ext2 version 0, this field is reserved. In version >= 1, /// Extended attribute block (File ACL). - ext_attribute_block: u32, + pub ext_attribute_block: u32, /// In Ext2 version 0, this field is reserved. In version >= 1, Upper /// 32 bits of file size (if feature bit set) if it's a file, /// Directory ACL if it's a directory - size_high: u32, + pub size_high: u32, /// Block address of fragment - frag_block_addr: u32, + pub frag_block_addr: u32, /// Operating System Specific Value #2 - _os_specific_2: [u8; 12], + pub _os_specific_2: [u8; 12], } bitflags! { diff --git a/src/sys/mod.rs b/src/sys/mod.rs new file mode 100644 index 0000000..91552bd --- /dev/null +++ b/src/sys/mod.rs @@ -0,0 +1,3 @@ +pub mod superblock; +pub mod block_group; +pub mod inode; diff --git a/src/superblock.rs b/src/sys/superblock.rs similarity index 87% rename from src/superblock.rs rename to src/sys/superblock.rs index bb59bfd..93748a4 100644 --- a/src/superblock.rs +++ b/src/sys/superblock.rs @@ -45,103 +45,103 @@ pub const OS_LITE: u32 = 4; pub struct Superblock { // taken from https://wiki.osdev.org/Ext2 /// Total number of inodes in file system - inodes_count: u32, + pub inodes_count: u32, /// Total number of blocks in file system - blocks_count: u32, + pub blocks_count: u32, /// Number of blocks reserved for superuser (see offset 80) - r_blocks_count: u32, + pub r_blocks_count: u32, /// Total number of unallocated blocks - free_blocks_count: u32, + pub free_blocks_count: u32, /// Total number of unallocated inodes - free_inodes_count: u32, + pub free_inodes_count: u32, /// Block number of the block containing the superblock - first_data_block: u32, + pub first_data_block: u32, /// log2 (block size) - 10. (In other words, the number to shift 1,024 /// to the left by to obtain the block size) - log_block_size: u32, + pub log_block_size: u32, /// log2 (fragment size) - 10. (In other words, the number to shift /// 1,024 to the left by to obtain the fragment size) - log_frag_size: i32, + pub log_frag_size: i32, /// Number of blocks in each block group - blocks_per_group: u32, + pub blocks_per_group: u32, /// Number of fragments in each block group - frags_per_group: u32, + pub frags_per_group: u32, /// Number of inodes in each block group - inodes_per_group: u32, + pub inodes_per_group: u32, /// Last mount time (in POSIX time) - mtime: u32, + pub mtime: u32, /// Last written time (in POSIX time) - wtime: u32, + pub wtime: u32, /// Number of times the volume has been mounted since its last /// consistency check (fsck) - mnt_count: u16, + pub mnt_count: u16, /// Number of mounts allowed before a consistency check (fsck) must be /// done - max_mnt_count: i16, + pub max_mnt_count: i16, /// Ext2 signature (0xef53), used to help confirm the presence of Ext2 /// on a volume - magic: u16, + pub magic: u16, /// File system state (see `FS_CLEAN` and `FS_ERR`) - state: u16, + pub state: u16, /// What to do when an error is detected (see `ERR_IGNORE`, `ERR_RONLY` and /// `ERR_PANIC`) - errors: u16, + pub errors: u16, /// Minor portion of version (combine with Major portion below to /// construct full version field) - rev_minor: u16, + pub rev_minor: u16, /// POSIX time of last consistency check (fsck) - lastcheck: u32, + pub lastcheck: u32, /// Interval (in POSIX time) between forced consistency checks (fsck) - checkinterval: u32, + pub checkinterval: u32, /// Operating system ID from which the filesystem on this volume was /// created - creator_os: u32, + pub creator_os: u32, /// Major portion of version (combine with Minor portion above to /// construct full version field) - rev_major: u32, + pub rev_major: u32, /// User ID that can use reserved blocks - block_uid: u16, + pub block_uid: u16, /// Group ID that can use reserved blocks - block_gid: u16, + pub block_gid: u16, /// First non-reserved inode in file system. - first_inode: u32, + pub first_inode: u32, /// Size of each inode structure in bytes. - inode_size: u16, + pub inode_size: u16, /// Block group that this superblock is part of (if backup copy) - block_group: u16, + pub block_group: u16, /// Optional features present (features that are not required to read /// or write, but usually result in a performance increase) - features_opt: FeaturesOptional, + pub features_opt: FeaturesOptional, /// Required features present (features that are required to be /// supported to read or write) - features_req: FeaturesRequired, + pub features_req: FeaturesRequired, /// Features that if not supported, the volume must be mounted /// read-only) - features_ronly: FeaturesROnly, + pub features_ronly: FeaturesROnly, /// File system ID (what is output by blkid) - fs_id: [u8; 16], + pub fs_id: [u8; 16], /// Volume name (C-style string: characters terminated by a 0 byte) - volume_name: [u8; 16], + pub volume_name: [u8; 16], /// Path volume was last mounted to (C-style string: characters /// terminated by a 0 byte) - last_mnt_path: [u8; 64], + pub last_mnt_path: [u8; 64], /// Compression algorithms used (see Required features above) - compression: u32, + pub compression: u32, /// Number of blocks to preallocate for files - prealloc_blocks_files: u8, + pub prealloc_blocks_files: u8, /// Number of blocks to preallocate for directories - prealloc_blocks_dirs: u8, + pub prealloc_blocks_dirs: u8, #[doc(hidden)] _unused: [u8; 2], /// Journal ID (same style as the File system ID above) - journal_id: [u8; 16], + pub journal_id: [u8; 16], /// Journal inode - journal_inode: u32, + pub journal_inode: u32, /// Journal device - journal_dev: u32, + pub journal_dev: u32, /// Head of orphan inode list - journal_orphan_head: u32, + pub journal_orphan_head: u32, #[doc(hidden)] _reserved: [u8; 788], }