diff --git a/src/unsafe-rust/solution.md b/src/unsafe-rust/solution.md index b4a4c92cd998..004edaa5e064 100644 --- a/src/unsafe-rust/solution.md +++ b/src/unsafe-rust/solution.md @@ -3,3 +3,28 @@ ```rust,editable {{#include exercise.rs:solution}} ``` + +- **Safety Comments:** Each `unsafe` block is preceded by a `// SAFETY:` comment + explaining why the operation is safe. This is standard practice in Rust to aid + auditing. +- **String conversions:** The code demonstrates the conversions required for + FFI: + - `&str` -> `CString`: To create a null-terminated string for C. + - `CString` -> `*const c_char`: To pass the pointer to C. + - `*const c_char` -> `&CStr`: To wrap the returned C string. + - `&CStr` -> `&[u8]` -> `&OsStr` -> `OsString`: To convert the bytes back to a + Rust OS string. +- **RAII (`Drop`):** We implement `Drop` to call `closedir` automatically when + the iterator goes out of scope. This ensures we don't leak file descriptors. +- **Iterator Interface:** We wrap the C API in a Rust `Iterator`, providing a + safe and idiomatic interface (`next` returns `Option`) to the + underlying unsafe C functions. + +
+ +- Explain that `CString` owns the data (like `String`), while `CStr` is a + borrowed reference (like `&str`). +- The `OsStrExt` trait is needed on Unix systems to convert bytes directly to + `OsStr`. + +