1
0
mirror of https://github.com/google/comprehensive-rust.git synced 2025-12-23 06:56:25 +02:00
Files
comprehensive-rust/src/unsafe-rust/exercise.md
Jason Lin a0edd51120 Add a note about using rust-bindgen (#2818)
Co-authored-by: Dmitri Gribenko <gribozavr@gmail.com>
2025-07-28 02:29:32 +00:00

2.9 KiB

minutes
minutes
30

Safe FFI Wrapper

Rust has great support for calling functions through a foreign function interface (FFI). We will use this to build a safe wrapper for the libc functions you would use from C to read the names of files in a directory.

You will want to consult the manual pages:

You will also want to browse the std::ffi module. There you find a number of string types which you need for the exercise:

Types Encoding Use
str and String UTF-8 Text processing in Rust
CStr and CString NUL-terminated Communicating with C functions
OsStr and OsString OS-specific Communicating with the OS

You will convert between all these types:

  • &str to CString: you need to allocate space for a trailing \0 character,
  • CString to *const i8: you need a pointer to call C functions,
  • *const i8 to &CStr: you need something which can find the trailing \0 character,
  • &CStr to &[u8]: a slice of bytes is the universal interface for "some unknown data",
  • &[u8] to &OsStr: &OsStr is a step towards OsString, use OsStrExt to create it,
  • &OsStr to OsString: you need to clone the data in &OsStr to be able to return it and call readdir again.

The Nomicon also has a very useful chapter about FFI.

Copy the code below to https://play.rust-lang.org/ and fill in the missing functions and methods:

// TODO: remove this when you're done with your implementation.
#![allow(unused_imports, unused_variables, dead_code)]

{{#include exercise.rs:ffi}}

{{#include exercise.rs:DirectoryIterator}}
        todo!()
    }
}

{{#include exercise.rs:Iterator}}
        todo!()
    }
}

{{#include exercise.rs:Drop}}
        todo!()
    }
}

{{#include exercise.rs:main}}

FFI binding code is typically generated by tools like bindgen, rather than being written manually as we are doing here. However, bindgen can't run in an online playground.