use std::mem::MaybeUninit;
use std::path::PathBuf;
use crate::core::utils::misc::{Disk, MiscError};
use crate::ffi_utils;
const MAX_FILE_PATH_LENGTH: usize = 4097;
pub fn device_path_from_number(device_number: u64) -> Option<PathBuf> {
log::debug!(
"misc::device_path_from_number getting device path from device number {:?}",
device_number
);
let mut ptr = MaybeUninit::<*mut libc::c_char>::zeroed();
unsafe {
ptr.write(libblkid::blkid_devno_to_devname(device_number));
}
match unsafe { ptr.assume_init() } {
path if path.is_null() => {
log::debug!(
"misc::device_path_from_number found no device path from device number {:?}. libblkid::blkid_devno_to_devname returned a NULL pointer",
device_number
);
None
}
path => {
let dev_path = ffi_utils::const_c_char_array_to_path_buf(path);
unsafe {
libc::free(path as *mut _);
}
log::debug!(
"misc::device_path_from_number found device path {:?} from device number {:?}",
dev_path,
device_number
);
Some(dev_path)
}
}
}
pub fn device_base_name_from_number(device_number: u64) -> Result<Disk, MiscError> {
log::debug!(
"misc::device_base_name_from_number getting whole disk name from device number {:?}",
device_number
);
let mut disk_name_buffer: Vec<libc::c_char> = vec![0; MAX_FILE_PATH_LENGTH];
let mut disk_device_number = MaybeUninit::<u64>::zeroed();
let result = unsafe {
libblkid::blkid_devno_to_wholedisk(
device_number,
disk_name_buffer.as_mut_ptr(),
MAX_FILE_PATH_LENGTH,
disk_device_number.as_mut_ptr(),
)
};
match result {
0 => {
let disk_name = ffi_utils::c_char_array_to_string(disk_name_buffer.as_ptr());
let disk_device_number = unsafe { disk_device_number.assume_init() };
log::debug!(
"misc::device_base_name_from_number got whole disk name {:?}",
disk_name
);
Ok(Disk::new(disk_name, disk_device_number))
}
code => {
let err_msg = format!(
"error getting whole disk name from device number: {}",
device_number
);
log::debug!("misc::device_base_name_from_number {}. libblkid::blkid_devno_to_wholedisk returned error code {:?}", err_msg, code);
Err(MiscError::Conversion(err_msg))
}
}
}