You've already forked comprehensive-rust
mirror of
https://github.com/google/comprehensive-rust.git
synced 2025-12-23 06:56:25 +02:00
2.9 KiB
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:
&strtoCString: you need to allocate space for a trailing\0character,CStringto*const i8: you need a pointer to call C functions,*const i8to&CStr: you need something which can find the trailing\0character,&CStrto&[u8]: a slice of bytes is the universal interface for "some unknown data",&[u8]to&OsStr:&OsStris a step towardsOsString, useOsStrExtto create it,&OsStrtoOsString: you need to clone the data in&OsStrto be able to return it and callreaddiragain.
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.