nix_user_chroot/
mkdtemp.rs

1use nix::errno::Errno;
2use std::env;
3use std::ffi::OsString;
4use std::os::unix::ffi::OsStringExt;
5use std::path::PathBuf;
6
7mod ffi {
8    extern "C" {
9        pub fn mkdtemp(template: *mut libc::c_char) -> *mut libc::c_char;
10    }
11}
12
13pub fn mkdtemp(template: &str) -> nix::Result<PathBuf> {
14    let mut tmpdir = env::temp_dir();
15    tmpdir.push(template);
16    let mut buf = tmpdir.into_os_string().into_vec();
17    buf.push(b'\0'); // make a c string
18
19    let res = unsafe { ffi::mkdtemp(buf.as_mut_ptr() as *mut libc::c_char) };
20    if res.is_null() {
21        Err(nix::Error::Sys(Errno::last()))
22    } else {
23        buf.pop(); // strip null byte
24        Ok(PathBuf::from(OsString::from_vec(buf)))
25    }
26}