Crates.io | doors |
lib.rs | doors |
version | 0.8.1 |
source | src |
created_at | 2019-05-30 00:48:41.18394 |
updated_at | 2023-05-01 02:06:45.302906 |
description | Access the illumos Doors API from Rust |
homepage | |
repository | https://github.com/robertdfrench/rusty-doors |
max_upload_size | |
id | 137794 |
size | 84,964 |
The goal of this crate is to expose the illumos Doors API in Rust. It exposes the native doors API verbatim, and also provides some moderately safer abstractions.
A door is a file-like mechanism for interprocess communication, not unlike a named pipe or a UNIX Domain Socket. Client programs can invoke functions (called server procedures) in door servers if the door server has made a door available on the filesystem.
A server procedure is a function within the door server program that has a special, predefined signature. It is the entrypoint for the thread that is created (or awoken) to handle a client's door invocation.
A door server is a process that has created a door from one of its server procedures.
A server procedure that simply doubles its input might look like this:
use doors::server::Door;
use doors::server::Request;
use doors::server::Response;
#[doors::server_procedure]
fn double(x: Request) -> Response<[u8; 1]> {
if x.data.len() > 0 {
return Response::new([x.data[0] * 2]);
} else {
// We were given nothing, and 2 times nothing is zero...
return Response::new([0]);
}
}
let door = Door::create(double).unwrap();
door.force_install("/tmp/double.door").unwrap();
A client program which invokes that server procedure might look something like this:
use doors::Client;
let client = Client::open("/tmp/double.door").unwrap();
let response = client.call_with_data(&[111]).unwrap();
assert_eq!(response.data()[0], 222);
The social media preview image is due to Jim Choate under the terms of CC BY-NC 2.0.
This work preceeds, but was reignited by oxidecomputer/rusty-doors.