# Rusty Doors
![](https://github.com/robertdfrench/rusty-doors/raw/HEAD/etc/social_media_preview.jpg)
The goal of this crate is to expose the [illumos][1] [Doors API][2] in
Rust. It exposes the native doors API verbatim, and also provides some
moderately safer abstractions.
## What are Doors?
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*.
## Example
A *server procedure* that simply doubles its input might look like this:
```rust
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:
```rust
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);
```
## Acknowledgements
* The social media preview image is due to [Jim Choate][4] under the
terms of [CC BY-NC 2.0][5].
* This work preceeds, but was reignited by
[oxidecomputer/rusty-doors][3].
[1]: https://illumos.org/
[2]: https://github.com/robertdfrench/revolving-door
[3]: https://github.com/oxidecomputer/rusty-doors
[4]: https://www.flickr.com/photos/jimchoate/50854146398
[5]: https://creativecommons.org/licenses/by-nc/2.0/