libbtrfs 0.0.20

Rust library for working with the btrfs filesystem
Documentation
mod default {
    use crate::bindings::*;

    impl Default for btrfs_ioctl_search_key {
        fn default() -> Self {
            Self {
                tree_id: BTRFS_ROOT_TREE_OBJECTID,
                min_objectid: u64::MIN,
                max_objectid: u64::MAX,
                min_offset: u64::MIN,
                max_offset: u64::MAX,
                min_transid: u64::MIN,
                max_transid: u64::MAX,
                min_type: u32::MIN,
                max_type: u32::MAX,
                nr_items: BTRFS_SEARCH_ARGS_BUFSIZE as u32,
                unused: 0,
                unused1: 0,
                unused2: 0,
                unused3: 0,
                unused4: 0,
            }
        }
    }

    macro_rules! impl_default {
        ($( $btrfs_ioctl_args:ty ),+) => [$(

            impl Default for $btrfs_ioctl_args {
                #[doc = stringify!(Returns $btrfs_ioctl_args with all fields initialized to zero)]
                fn default() -> Self {
                    unsafe {
                        // SAFTEY:
                        // Only implemented for types valid for zero-initialization
                        //
                        ::std::mem::zeroed()
                    }
                }
            }

        )+]
    }

    impl_default![
        btrfs_ioctl_vol_args,
        btrfs_ioctl_clone_range_args,
        btrfs_ioctl_defrag_range_args,
        btrfs_ioctl_search_args,
        btrfs_ioctl_search_args_v2,
        btrfs_ioctl_ino_lookup_args,
        btrfs_ioctl_space_args,
        btrfs_ioctl_vol_args_v2,
        btrfs_ioctl_scrub_args,
        btrfs_ioctl_dev_info_args,
        btrfs_ioctl_fs_info_args,
        btrfs_ioctl_balance_args,
        btrfs_ioctl_ino_path_args,
        btrfs_ioctl_logical_ino_args,
        btrfs_ioctl_received_subvol_args,
        btrfs_ioctl_send_args,
        btrfs_ioctl_quota_ctl_args,
        btrfs_ioctl_qgroup_assign_args,
        btrfs_ioctl_qgroup_create_args,
        btrfs_ioctl_qgroup_limit_args,
        btrfs_ioctl_quota_rescan_args,
        btrfs_ioctl_get_dev_stats,
        btrfs_ioctl_dev_replace_args,
        btrfs_ioctl_same_args,
        btrfs_ioctl_feature_flags,
        btrfs_ioctl_get_subvol_info_args,
        btrfs_ioctl_get_subvol_rootref_args,
        btrfs_ioctl_ino_lookup_user_args,
        btrfs_ioctl_encoded_io_args
    ];
}

mod from {
    use crate::bindings::*;

    macro_rules! impl_from_c_chars {
        ($( $btrfs_search_item:ty ),+) => [$(

            impl From<&[::libc::c_char]> for &$btrfs_search_item {
                #[inline]
                fn from(value: &[::libc::c_char]) -> Self {
                    // SAFTEY:
                    // All structs are packed so alignment is guaranteed. Additionally the
                    // guarantees from the c_char slice also apply to the pointer ie non-null
                    //
                    ::std::debug_assert!(value.len() >= ::std::mem::size_of::<$btrfs_search_item>());
                    unsafe { &*(value as *const _ as *const $btrfs_search_item) }
                }
            }

        )+]
    }

    #[cfg(VERSION_6_2)]
    impl_from_c_chars![
        btrfs_header,
        btrfs_item,
        btrfs_key_ptr,
        btrfs_leaf,
        btrfs_node,
        btrfs_root_backup,
        btrfs_super_block
    ];

    impl_from_c_chars![
        btrfs_disk_key,
        btrfs_key,
        btrfs_dev_item,
        btrfs_stripe,
        btrfs_chunk,
        btrfs_free_space_entry,
        btrfs_free_space_header,
        btrfs_extent_item,
        btrfs_extent_item_v0,
        btrfs_tree_block_info,
        btrfs_extent_data_ref,
        btrfs_shared_data_ref,
        btrfs_extent_inline_ref,
        btrfs_dev_extent,
        btrfs_inode_ref,
        btrfs_inode_extref,
        btrfs_timespec,
        btrfs_inode_item,
        btrfs_dir_log_item,
        btrfs_dir_item,
        btrfs_root_item,
        btrfs_root_ref,
        btrfs_disk_balance_args,
        btrfs_balance_item,
        btrfs_file_extent_item,
        btrfs_csum_item,
        btrfs_dev_stats_item,
        btrfs_dev_replace_item,
        btrfs_block_group_item,
        btrfs_free_space_info,
        btrfs_qgroup_status_item,
        btrfs_qgroup_info_item,
        btrfs_qgroup_limit_item,
        btrfs_verity_descriptor_item
    ];
}

#[cfg(feature = "debug")]
mod debug {
    use crate::*;
    use std::fmt::{self, Debug, Formatter};

    impl Debug for subvol::SubvolInfo {
        fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
            f.debug_struct("SubvolInfo")
                .field("treeid", &self.treeid())
                .field("name", &self.name_as_str())
                .field("parent_id", &self.parent_id())
                .field("dirid", &self.dirid())
                .field("generation", &self.generation())
                .field("flags", &self.flags())
                .field("uuid", &self.uuid())
                .field("parend_uuid", &self.parent_uuid())
                .field("received_uuid", &self.received_uuid())
                .field("ctransid", &self.ctransid())
                .field("otransid", &self.otransid())
                .field("stransid", &self.stransid())
                .field("rtransid", &self.rtransid())
                .field(
                    "ctime",
                    &format_args!(
                        "{{ sec: {}, nsec: {} }}",
                        &self.ctime().sec,
                        &self.ctime().nsec
                    ),
                )
                .field(
                    "otime",
                    &format_args!(
                        "{{ sec: {}, nsec: {} }}",
                        &self.otime().sec,
                        &self.otime().nsec
                    ),
                )
                .field(
                    "stime",
                    &format_args!(
                        "{{ sec: {}, nsec: {} }}",
                        &self.stime().sec,
                        &self.stime().nsec
                    ),
                )
                .field(
                    "rtime",
                    &format_args!(
                        "{{ sec: {}, nsec: {} }}",
                        &self.rtime().sec,
                        &self.rtime().nsec
                    ),
                )
                .finish()
        }
    }

    impl Debug for fs::FsInfo {
        fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
            f.debug_struct("FsInfo")
                .field("max_id", &self.max_id())
                .field("num_devices", &self.num_devices())
                .field("fsid", &self.fsid())
                .field("nodesize", &self.nodesize())
                .field("sectorsize", &self.sectorsize())
                .field("clone_alignment", &self.clone_alignment())
                .finish()
        }
    }

    impl Debug for fs::SpaceInfo {
        fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
            f.debug_struct("SpaceInfo")
                .field("block_type", &self.block_type())
                .field("raid_profile", &self.raid_profile().map(|v| v.upper_name))
                .field("used_bytes", &self.used_bytes())
                .field("total_bytes", &self.total_bytes())
                .finish()
        }
    }

    impl Debug for crate::tree_search::SearchItem<'_> {
        fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
            f.debug_struct("SearchItem")
                .field("header_type", &self.item_type())
                .field("offset", &self.offset())
                .finish()
        }
    }
}