summaryrefslogtreecommitdiffstats
path: root/src/app/data_harvester/disks/unix/macos/io_kit/io_disks.rs
blob: 9552b0b7024de0de4fea91b24c44f808c9295dd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use anyhow::bail;
use mach2::kern_return;

use super::{bindings::*, IoIterator};

pub fn get_disks() -> anyhow::Result<IoIterator> {
    let mut media_iter: io_iterator_t = 0;

    // SAFETY: This is a safe syscall via IOKit, all the arguments should be safe.
    let result = unsafe {
        IOServiceGetMatchingServices(
            kIOMasterPortDefault,
            IOServiceMatching(kIOMediaClass.as_ptr().cast()),
            &mut media_iter,
        )
    };

    if result == kern_return::KERN_SUCCESS {
        Ok(media_iter.into())
    } else {
        bail!("IOServiceGetMatchingServices failed, error code {result}");
    }
}