从 Rust 读取 ISO 映像(FFI 绑定)
read ISO image from Rust (FFI bindings)
我正在尝试使用 Rust 从 ISO 映像中读取内容。我已经在我的 Linux 机器上安装了 libiso9660-dev
和 libcdio-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 代码为此参数传递了一个空指针,这就是问题所在。
我正在尝试使用 Rust 从 ISO 映像中读取内容。我已经在我的 Linux 机器上安装了 libiso9660-dev
和 libcdio-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 代码为此参数传递了一个空指针,这就是问题所在。