#libc #stream #ffi

fopencookie

std::io和libc::FILE之间的接口

2个版本

0.1.1 2024年5月10日
0.1.0 2024年5月10日

#521 in 文件系统

MIT/Apache

49KB
959

使用fopencookie系统调用,将io::Write/io::Read/io::Seek转换为libc::FILE流。

非常适合在FFI中传递Rust特性。

let mut v = vec![];
let stream = fopencookie::IoCStream::writer(&mut v);

// Use the libc stream functions
assert_eq!(
    unsafe {
        libc::fprintf(stream.as_ptr(), c"hello, world!".as_ptr())
    },
    13 // all bytes written
);

// It's reflected in our rust type!
assert_eq!(v, b"hello, world!");

支持特质对象!

let mut reader: Box<dyn io::Read>;
let stream = fopencookie::IoCStream::reader(reader);

您可以使用Builder来获得更多灵活性。

let mut file: File;
let stream = fopencookie::Builder::new()
    .read()
    .write()
    .seek()
    .build(file);

lib.rs:

使用fopencookie系统调用,将io::Write/io::Read/io::Seek转换为libc::FILE流。

非常适合在FFI中传递Rust特性。

let mut v = vec![];
let stream = fopencookie::IoCStream::writer(&mut v);

// Use the libc stream functions
assert_eq!(
    unsafe {
        libc::fprintf(stream.as_ptr(), c"hello, world!".as_ptr())
    },
    13 // all bytes written
);

// It's reflected in our rust type!
assert_eq!(v, b"hello, world!");

支持特质对象!

let mut reader: Box<dyn io::Read>;
let stream = fopencookie::IoCStream::reader(reader);

您可以使用Builder来获得更多灵活性。

let mut file: File;
let stream = fopencookie::Builder::new()
    .read()
    .write()
    .seek()
    .build(file);

依赖关系

~0–2MB
~41K SLoC