containerization-framework 0.4.0

Rust bindings for Apple's Containerization framework: Linux containers in lightweight VMs, in-process and without a daemon.
use crate::platform;

/// `EXT4.SuperBlock`. Swift's tuples are arrays.
///
/// Laid out as Swift's is, which is ext4's layout on disk, so it crosses from
/// Swift as its bytes.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(C)]
pub struct SuperBlock {
  pub inodes_count: u32,
  pub blocks_count_low: u32,
  pub reserved_blocks_count_low: u32,
  pub free_blocks_count_low: u32,
  pub free_inodes_count: u32,
  pub first_data_block: u32,
  pub log_block_size: u32,
  pub log_cluster_size: u32,
  pub blocks_per_group: u32,
  pub clusters_per_group: u32,
  pub inodes_per_group: u32,
  pub mtime: u32,
  pub wtime: u32,
  pub mount_count: u16,
  pub max_mount_count: u16,
  pub magic: u16,
  pub state: u16,
  pub errors: u16,
  pub minor_revision_level: u16,
  pub last_check: u32,
  pub check_interval: u32,
  pub creator_os: u32,
  pub revision_level: u32,
  pub default_reserved_uid: u16,
  pub default_reserved_gid: u16,
  pub first_inode: u32,
  pub inode_size: u16,
  pub block_group_nr: u16,
  pub feature_compat: u32,
  pub feature_incompat: u32,
  pub feature_ro_compat: u32,
  pub uuid: [u8; 16],
  pub volume_name: [u8; 16],
  pub last_mounted: [u8; 64],
  pub algorithm_usage_bitmap: u32,
  pub prealloc_blocks: u8,
  pub prealloc_dir_blocks: u8,
  pub reserved_gdt_blocks: u16,
  pub journal_uuid: [u8; 16],
  pub journal_inum: u32,
  pub journal_dev: u32,
  pub last_orphan: u32,
  pub hash_seed: [u32; 4],
  pub def_hash_version: u8,
  pub journal_backup_type: u8,
  pub desc_size: u16,
  pub default_mount_opts: u32,
  pub first_meta_bg: u32,
  pub mkfs_time: u32,
  pub journal_blocks: [u32; 17],
  pub blocks_count_high: u32,
  pub reserved_blocks_count_high: u32,
  pub free_blocks_count_high: u32,
  pub min_extra_isize: u16,
  pub want_extra_isize: u16,
  pub flags: u32,
  pub raid_stride: u16,
  pub mmp_interval: u16,
  pub mmp_block: u64,
  pub raid_stripe_width: u32,
  pub log_groups_per_flex: u8,
  pub checksum_type: u8,
  pub reserved_pad: u16,
  pub kbytes_written: u64,
  pub snapshot_inum: u32,
  pub snapshot_id: u32,
  pub snapshot_r_blocks_count: u64,
  pub snapshot_list: u32,
  pub error_count: u32,
  pub first_error_time: u32,
  pub first_error_inode: u32,
  pub first_error_block: u64,
  pub first_error_func: [u8; 32],
  pub first_error_line: u32,
  pub last_error_time: u32,
  pub last_error_inode: u32,
  pub last_error_line: u32,
  pub last_error_block: u64,
  pub last_error_func: [u8; 32],
  pub mount_opts: [u8; 64],
  pub user_quota_inum: u32,
  pub group_quota_inum: u32,
  pub overhead_blocks: u32,
  pub backup_bgs: [u32; 2],
  pub encrypt_algos: [u8; 4],
  pub encrypt_pw_salt: [u8; 16],
  pub lpf_inode: u32,
  pub project_quota_inum: u32,
  pub checksum_seed: u32,
  pub wtime_high: u8,
  pub mtime_high: u8,
  pub mkfs_time_high: u8,
  pub lastcheck_high: u8,
  pub first_error_time_high: u8,
  pub last_error_time_high: u8,
  pub pad: [u8; 2],
  pub reserved: [u32; 96],
  pub checksum: u32,
}

// SAFETY: `repr(C)`, and only integers and arrays of them, so any bytes make
// one.
unsafe impl platform::Plain for SuperBlock {}

impl SuperBlock {
  /// `blockSize`. Like Swift's `<<`, a shift past the width is 0.
  pub fn block_size(&self) -> u32 {
    1024_u32.checked_shl(self.log_block_size).unwrap_or(0)
  }
}