Forum | Documentation | Website | Blog

Skip to content
Snippets Groups Projects
Verified Commit 7c5ca6db authored by Zain Siddavatam's avatar Zain Siddavatam :fire: Committed by Ayush Singh
Browse files

bb-imager: Enhance diskutil to retrieve detailed disk info on macOS


- Better names for sd card selection on macos

Changelog: added
Signed-off-by: Zain Siddavatam's avatarZain Siddavatam <beingzainsv@gmail.com>
Signed-off-by: Ayush Singh's avatarAyush Singh <ayush@beagleboard.org>
parent de7dea7c
Branches
Tags
1 merge request!28macOS QOL fixes
......@@ -99,6 +99,7 @@ pub(crate) mod rs_drivelist {
use rs_drivelist::device::{DeviceDescriptor, MountPoint};
use serde::Deserialize;
use std::process::Command;
use anyhow::Result;
#[derive(Deserialize, Debug)]
struct Disks {
......@@ -130,6 +131,14 @@ pub(crate) mod rs_drivelist {
size: u64,
}
#[derive(Deserialize, Debug)]
struct DiskInfo {
#[serde(rename = "Ejectable")]
ejectable: bool,
#[serde(rename = "IORegistryEntryName")]
io_registry_entry_name: String,
}
impl From<Disk> for DeviceDescriptor {
fn from(value: Disk) -> Self {
DeviceDescriptor {
......@@ -157,28 +166,49 @@ pub(crate) mod rs_drivelist {
}
}
pub(crate) fn diskutil() -> anyhow::Result<Vec<DeviceDescriptor>> {
let output = Command::new("diskutil").args(["list", "-plist"]).output()?;
if let Some(code) = output.status.code() {
if code != 0 {
return Err(anyhow::Error::msg(format!("lsblk ExitCode: {}", code)));
}
fn get_disk_info(device: &str) -> Result<DiskInfo> {
let output = Command::new("diskutil")
.args(["info", "-plist", device])
.output()?;
if !output.status.success() {
return Err(anyhow::Error::msg(format!(
"diskutil info failed: {}",
std::str::from_utf8(&output.stderr).unwrap()
)));
}
let disk_info: DiskInfo = plist::from_bytes(&output.stdout)?;
Ok(disk_info)
}
if output.stderr.len() > 0 {
pub(crate) fn diskutil() -> Result<Vec<DeviceDescriptor>> {
let output = Command::new("diskutil").args(["list", "-plist", "physical"]).output()?;
if !output.status.success() {
return Err(anyhow::Error::msg(format!(
"lsblk stderr: {}",
"diskutil list failed: {}",
std::str::from_utf8(&output.stderr).unwrap()
)));
}
let parsed: Disks = plist::from_bytes(&output.stdout).unwrap();
Ok(parsed
.all_disks_and_partitions
.into_iter()
.map(DeviceDescriptor::from)
.collect())
let mut devices = Vec::new();
for disk in parsed.all_disks_and_partitions {
let device_path = format!("/dev/{}", disk.device_identifier);
match get_disk_info(&device_path) {
Ok(info) => {
if info.ejectable {
let mut device_descriptor: DeviceDescriptor = disk.into();
device_descriptor.description = info.io_registry_entry_name;
devices.push(device_descriptor);
}
}
Err(e) => {
eprintln!("Failed to get disk info for {}: {}", device_path, e);
}
}
}
Ok(devices)
}
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment