从 Rust 读取 ISO 映像(FFI 绑定)

read ISO image from Rust (FFI bindings)

我正在尝试使用 Rust 从 ISO 映像中读取内容。我已经在我的 Linux 机器上安装了 libiso9660-devlibcdio-dev 以访问头文件。 Libiso9660 is a library to work with ISO9660 filesystems (development files). I used bindgen 生成库的绑定。到目前为止,一切都非常简单。

这是与我的代码相关的绑定部分:

    extern "C" {
        pub fn iso9660_open(psz_path: *const ::std::os::raw::c_char) -> *mut iso9660_t;
    }

    extern "C" {
        pub fn iso9660_ifs_get_application_id(
            p_iso: *mut iso9660_t,
            p_psz_app_id: *mut *mut cdio_utf8_t,
        ) -> ::std::os::raw::c_uchar;
    }

下一步是使用生成的绑定。这是相关代码:

    include!(concat!(env!("OUT_DIR"), "/bindings.rs"));

    use std::os::raw::{c_char};
    use std::ffi::{CString};
    use std::ptr;

    pub fn open_image(path: &str) {
        let c_str = CString::new(path).unwrap();
        let psz_path = c_str.as_ptr() as *const c_char;
        let image = unsafe { iso9660_open(psz_path) };
        get_image_info(image);
    }

    fn get_image_info(image: *mut iso9660_t) {
        println!("Getting image info...");
        let ptr_null = ptr::null_mut();
        let app_info = unsafe { iso9660_ifs_get_application_id(image, ptr_null) };
        // here is the "segmentation fault (core dumped)"
    }

这是我想在 Rust 中复制的 the example(第 89 行是我此时所在的位置)。

open_image 似乎在工作,但是当我调用 iso9660_ifs_get_application_id 时出现分段错误。我假设由于类型的原因,我没有按应有的方式调用该方法,但除此之外,我什么都没有。任何提示或帮助将不胜感激。谢谢!

注意 p_psz_app_id 参数的类型:*mut *mut cdio_utf8_t。它是一个双指针。以下是 C 示例代码的作用:

char *psz_str = NULL;
if (iso9660_ifs_get_application_id(p_iso, &psz_str)) {
  printf(title ": %s\n", psz_str);
}
free(psz_str);
psz_str = NULL;

它正在将 &psz_str 传递给 iso9660_ifs_get_application_id() 函数。这里,&psz_str是指向空指针psz_str的有效指针;它不是 本身 空指针。 Rust 代码为此参数传递了一个空指针,这就是问题所在。