如何在 Rust 中编写绑定到需要打开文件句柄的 C 函数?

How can I write binding to a C function that expects an open file handle in Rust?

我以前玩过用 Rust 编写库绑定,并不难。然而,现在,我被困住了:我正在尝试为 librsync 编写一个绑定,它的一些函数希望您传递一个打开的文件句柄(C 中的 FILE*)。

对于基本类型,有一种直接的方法可以将它们传递到 C 中(对于基本类型的指针也是如此)。而且,需要明确的是,我知道 libc crate 实现了 fopen,这反过来又给了我一个 mut FILE*(最终会完成这项工作)。但是,我想知道 Rust 标准库中是否有一些东西可以让我将 FILE* 传递给 librsync — 也许类似于 std::ffi::CString.

你当然可以使用 RawFd,用它转化并调用 libc::funcs::posix88::stdio::fdopen(_, mode)。不过那将是非常不可移植的。

cfile (crate docs) looks like a lightweight wrapper around libcs FILE* that implements the io::Read/Write/Seek 个特征。