use doors::illumos::door_h;
use libc;
use std::ffi::CString;
use std::io::Read;
use std::io::Write;
use std::os::fd::FromRawFd;
use std::os::fd::RawFd;
use std::path::Path;
use std::ptr;
#[test]
fn can_read_from_returned_descriptor() {
let door_path = Path::new("/tmp/barebones_open.door");
let door_path_cstring = CString::new(door_path.to_str().unwrap()).unwrap();
let txt_path_str = "/tmp/barebones_open.txt";
let txt_path = Path::new(&txt_path_str);
let mut txt = std::fs::File::create(txt_path).expect("create txt");
writeln!(txt, "Hello, World!").expect("write txt");
drop(txt);
let client_door_fd =
unsafe { libc::open(door_path_cstring.as_ptr(), libc::O_RDONLY) };
let txt_path_cstring = CString::new(txt_path.to_str().unwrap()).unwrap();
let params = door_h::door_arg_t {
data_ptr: txt_path_cstring.as_ptr(),
data_size: txt_path_str.len() + 1, desc_ptr: ptr::null(),
desc_num: 0,
rbuf: ptr::null(),
rsize: 0,
};
unsafe { door_h::door_call(client_door_fd, ¶ms) };
assert_ne!(params.rbuf, ptr::null());
let door_desc_ts = unsafe {
std::slice::from_raw_parts::<door_h::door_desc_t>(
params.desc_ptr,
params.desc_num.try_into().unwrap(),
)
};
assert_eq!(door_desc_ts.len(), 1);
let d_data = &door_desc_ts[0].d_data;
let d_desc = unsafe { d_data.d_desc };
let raw_fd = d_desc.d_descriptor as RawFd;
let mut txt = unsafe { std::fs::File::from_raw_fd(raw_fd) };
let mut buffer = String::new();
txt.read_to_string(&mut buffer).expect("read txt");
assert_eq!(&buffer, "Hello, World!\n");
}