doors 0.8.1

Access the illumos Doors API from Rust
Documentation
//! A Barebones server using only the illumos headers, and no additional
//! support. This helps validate that the headers are expressed correctly in
//! Rust.

use doors::illumos::door_h;
use doors::illumos::stropts_h;
use libc;
use std::ffi::{CStr, CString};
use std::fs;
use std::path::Path;
use std::ptr;

// The simplest possible smoke test is to see if we can both call and
// answer our own door invocation. Remember: door_create does not change
// control, but door_call and door_return do. So we only need one thread
// to pull this off.
extern "C" fn capitalize_string(
    _cookie: *const libc::c_void,
    argp: *const libc::c_char,
    arg_size: libc::size_t,
    _dp: *const door_h::door_desc_t,
    _n_desc: libc::c_uint,
) {
    // Capitalize the string provided by the client. This is a lazy way
    // to verify that we are able to send and receive data through
    // doors. We aren't testing descriptors, because we aren't really
    // testing doors itself, just making sure our Rust interface works.
    let original = unsafe { CStr::from_ptr(argp) };
    let original = original.to_str().unwrap();
    let capitalized = original.to_ascii_uppercase();
    let capitalized = CString::new(capitalized).unwrap();
    unsafe {
        door_h::door_return(capitalized.as_ptr(), arg_size, ptr::null(), 0)
    };
}

fn main() {
    let door_path = Path::new("/tmp/barebones_capitalize.door");
    if door_path.exists() {
        fs::remove_file(door_path).unwrap();
    }
    let door_path_cstring = CString::new(door_path.to_str().unwrap()).unwrap();

    // Create a door for our "Capitalization Server"
    unsafe {
        // Create the (as yet unnamed) door descriptor.
        let server_door_fd =
            door_h::door_create(capitalize_string, ptr::null(), 0);

        // Create an empty file on the filesystem at `door_path`.
        fs::File::create(door_path).unwrap();

        // Give the door descriptor a name on the filesystem.
        stropts_h::fattach(server_door_fd, door_path_cstring.as_ptr());
    }

    std::thread::sleep(std::time::Duration::from_secs(5));
}