]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - bch_bindgen/src/bcachefs.rs
move Rust sources to top level, C sources into c_src
[bcachefs-tools-debian] / bch_bindgen / src / bcachefs.rs
diff --git a/bch_bindgen/src/bcachefs.rs b/bch_bindgen/src/bcachefs.rs
new file mode 100644 (file)
index 0000000..8e897c0
--- /dev/null
@@ -0,0 +1,112 @@
+#![allow(non_upper_case_globals)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+#![allow(unused)]
+
+include!(concat!(env!("OUT_DIR"), "/bcachefs.rs"));
+
+use bitfield::bitfield;
+bitfield! {
+    pub struct bch_scrypt_flags(u64);
+    pub N, _: 15, 0;
+    pub R, _: 31, 16;
+    pub P, _: 47, 32;
+}
+bitfield! {
+    pub struct bch_crypt_flags(u64);
+    pub TYPE, _: 4, 0;
+}
+use memoffset::offset_of;
+impl bch_sb_field_crypt {
+    pub fn scrypt_flags(&self) -> Option<bch_scrypt_flags> {
+        use std::convert::TryInto;
+        match bch_kdf_types(bch_crypt_flags(self.flags).TYPE().try_into().ok()?) {
+            bch_kdf_types::BCH_KDF_SCRYPT => Some(bch_scrypt_flags(self.kdf_flags)),
+            _ => None,
+        }
+    }
+    pub fn key(&self) -> &bch_encrypted_key {
+        &self.key
+    }
+}
+impl PartialEq for bch_sb {
+    fn eq(&self, other: &Self) -> bool {
+        self.magic.b == other.magic.b
+            && self.user_uuid.b == other.user_uuid.b
+            && self.block_size == other.block_size
+            && self.version == other.version
+            && self.uuid.b == other.uuid.b
+            && self.seq == other.seq
+    }
+}
+
+impl bch_sb {
+    pub fn crypt(&self) -> Option<&bch_sb_field_crypt> {
+        unsafe {
+            let ptr = bch2_sb_field_get_id(
+                self as *const _ as *mut _,
+                bch_sb_field_type::BCH_SB_FIELD_crypt,
+            ) as *const u8;
+            if ptr.is_null() {
+                None
+            } else {
+                let offset = offset_of!(bch_sb_field_crypt, field);
+                Some(&*((ptr.sub(offset)) as *const _))
+            }
+        }
+    }
+    pub fn uuid(&self) -> uuid::Uuid {
+        uuid::Uuid::from_bytes(self.user_uuid.b)
+    }
+
+    /// Get the nonce used to encrypt the superblock
+    pub fn nonce(&self) -> nonce {
+        use byteorder::{LittleEndian, ReadBytesExt};
+        let mut internal_uuid = &self.uuid.b[..];
+        let dword1 = internal_uuid.read_u32::<LittleEndian>().unwrap();
+        let dword2 = internal_uuid.read_u32::<LittleEndian>().unwrap();
+        nonce {
+            d: [0, 0, dword1, dword2],
+        }
+    }
+}
+impl bch_sb_handle {
+    pub fn sb(&self) -> &bch_sb {
+        unsafe { &*self.sb }
+    }
+
+    pub fn bdev(&self) -> &block_device {
+        unsafe { &*self.bdev }
+    }
+}
+
+#[repr(C)]
+// #[repr(align(8))]
+#[derive(Debug, Default, Copy, Clone)]
+pub struct bch_extent_ptr {
+    pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>,
+}
+
+#[repr(C, packed(8))]
+pub struct btree_node {
+    pub csum: bch_csum,
+    pub magic: __le64,
+    pub flags: __le64,
+    pub min_key: bpos,
+    pub max_key: bpos,
+    pub _ptr: bch_extent_ptr,
+    pub format: bkey_format,
+    pub __bindgen_anon_1: btree_node__bindgen_ty_1,
+}
+
+#[repr(C, packed(8))]
+// #[repr(align(8))]
+#[derive(Debug, Default, Copy, Clone)]
+pub struct bch_extent_crc32 {
+    pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>,
+    pub csum: __u32,
+}
+
+// #[repr(u8)]
+pub enum rhash_lock_head {}
+pub enum srcu_struct {}