1use std::ffi::CStr;
6
7use uuid::Uuid;
8
9use crate::{
10 devno::BlkidDevno,
11 err::BlkidErr,
12 utils::{BlkidBytes, BlkidSectors},
13 Result,
14};
15
16pub struct BlkidParttable(libblkid_rs_sys::blkid_parttable);
18
19impl BlkidParttable {
20 pub fn get_type(&self) -> Result<String> {
22 Ok(unsafe {
23 CStr::from_ptr(errno_ptr!(libblkid_rs_sys::blkid_parttable_get_type(
24 self.0
25 ))?)
26 }
27 .to_str()?
28 .to_string())
29 }
30
31 pub fn get_id(&self) -> Result<String> {
34 Ok(
35 unsafe { CStr::from_ptr(errno_ptr!(libblkid_rs_sys::blkid_parttable_get_id(self.0))?) }
36 .to_str()?
37 .to_string(),
38 )
39 }
40
41 pub fn get_offset(&self) -> Result<BlkidBytes> {
43 Ok(BlkidBytes::new(errno_with_ret!(unsafe {
44 libblkid_rs_sys::blkid_parttable_get_offset(self.0)
45 })?))
46 }
47
48 pub fn get_parent(&self) -> Option<BlkidPartition> {
50 option_ptr!(unsafe { libblkid_rs_sys::blkid_parttable_get_parent(self.0) })
51 .map(BlkidPartition)
52 }
53}
54
55pub struct BlkidPartition(libblkid_rs_sys::blkid_partition);
57
58impl BlkidPartition {
59 pub fn get_table(&self) -> Result<BlkidParttable> {
61 Ok(BlkidParttable(errno_ptr!(unsafe {
62 libblkid_rs_sys::blkid_partition_get_table(self.0)
63 })?))
64 }
65
66 pub fn get_name(&self) -> Result<Option<String>> {
68 let char_ptr =
69 match option_ptr!(unsafe { libblkid_rs_sys::blkid_partition_get_name(self.0) }) {
70 Some(ptr) => ptr,
71 None => return Ok(None),
72 };
73 unsafe { CStr::from_ptr(char_ptr) }
74 .to_str()
75 .map(|s| Some(s.to_string()))
76 .map_err(BlkidErr::UTF8)
77 }
78
79 pub fn get_uuid(&self) -> Result<Option<Uuid>> {
81 let char_ptr =
82 match option_ptr!(unsafe { libblkid_rs_sys::blkid_partition_get_uuid(self.0) }) {
83 Some(ptr) => ptr,
84 None => return Ok(None),
85 };
86 match unsafe { CStr::from_ptr(char_ptr) }.to_str() {
87 Ok(s) => Ok(Some(Uuid::parse_str(s).map_err(BlkidErr::Uuid)?)),
88 Err(e) => Err(BlkidErr::UTF8(e)),
89 }
90 }
91
92 pub fn get_partno(&self) -> Result<libc::c_uint> {
94 errno_with_ret!(unsafe { libblkid_rs_sys::blkid_partition_get_partno(self.0) })
95 .map(|i| i as libc::c_uint)
96 }
97
98 pub fn get_start(&self) -> BlkidSectors {
100 BlkidSectors::new(unsafe { libblkid_rs_sys::blkid_partition_get_start(self.0) })
101 }
102
103 pub fn get_size(&self) -> BlkidSectors {
105 BlkidSectors::new(unsafe { libblkid_rs_sys::blkid_partition_get_size(self.0) })
106 }
107
108 pub fn get_type(&self) -> libc::c_int {
111 unsafe { libblkid_rs_sys::blkid_partition_get_type(self.0) }
112 }
113
114 pub fn get_type_string(&self) -> Result<String> {
116 Ok(unsafe {
117 CStr::from_ptr(errno_ptr!(
118 libblkid_rs_sys::blkid_partition_get_type_string(self.0)
119 )?)
120 }
121 .to_str()?
122 .to_string())
123 }
124
125 pub fn get_flags(&self) -> libc::c_ulonglong {
130 unsafe { libblkid_rs_sys::blkid_partition_get_flags(self.0) }
131 }
132
133 pub fn is_logical(&self) -> bool {
135 (unsafe { libblkid_rs_sys::blkid_partition_is_logical(self.0) }) != 0
136 }
137
138 pub fn is_extended(&self) -> bool {
140 (unsafe { libblkid_rs_sys::blkid_partition_is_extended(self.0) }) != 0
141 }
142
143 pub fn is_primary(&self) -> bool {
145 (unsafe { libblkid_rs_sys::blkid_partition_is_primary(self.0) }) != 0
146 }
147}
148
149pub struct BlkidPartlist(libblkid_rs_sys::blkid_partlist);
151
152impl BlkidPartlist {
153 pub(crate) fn new(partlist: libblkid_rs_sys::blkid_partlist) -> BlkidPartlist {
154 BlkidPartlist(partlist)
155 }
156
157 pub fn number_of_partitions(&mut self) -> Result<libc::c_int> {
159 errno_with_ret!(unsafe { libblkid_rs_sys::blkid_partlist_numof_partitions(self.0) })
160 }
161
162 pub fn get_table(&mut self) -> Result<BlkidParttable> {
164 Ok(BlkidParttable(errno_ptr!(unsafe {
165 libblkid_rs_sys::blkid_partlist_get_table(self.0)
166 })?))
167 }
168
169 pub fn get_partition(&mut self, index: libc::c_int) -> Result<BlkidPartition> {
171 Ok(BlkidPartition(errno_ptr!(unsafe {
172 libblkid_rs_sys::blkid_partlist_get_partition(self.0, index)
173 })?))
174 }
175
176 pub fn get_partition_by_partno(&mut self, num: libc::c_int) -> Result<BlkidPartition> {
179 Ok(BlkidPartition(errno_ptr!(unsafe {
180 libblkid_rs_sys::blkid_partlist_get_partition_by_partno(self.0, num)
181 })?))
182 }
183
184 pub fn get_partition_by_devno(&mut self, dev: &BlkidDevno) -> Result<BlkidPartition> {
186 Ok(BlkidPartition(errno_ptr!(unsafe {
187 libblkid_rs_sys::blkid_partlist_devno_to_partition(self.0, dev.as_dev_t())
188 })?))
189 }
190}