Using libc read and write

Hi

I am trying to use libc's read and write functions and the buffers are of type c_void. How do I convert a string or array in Rust to c_void?

If you have an &[u8], you can call slice.as_ptr() to obtain a raw pointer of type *const u8. Then you can cast it to an *const c_void.

use std::ffi::c_void;

let ptr = slice.as_ptr() as *const c_void;

With a &str, first call as_bytes() to convert it to a &[u8].

When reading, you should use as_mut_ptr instead to get a pointer through which mutation is allowed.

You should probably use the nix::unistd::read and nix::unistd::write methods from nix crate. These are safe, unlike the methods from the libc crate.

2 Likes

Note also that reading through the pointer into string is unsafe - if the bytes written are not valid UTF-8, this will be UB.

Yeah, always read into a byte array, then convert to a string.