Files
RedBear-OS/ipcd/examples/unnamed.rs
T
bjorn3 b0586e9ead Add 'ipcd/' from commit 'e6f672bd48f9ac65a194f804bd0ed64c307f7b67'
git-subtree-dir: ipcd
git-subtree-mainline: 999da13e76
git-subtree-split: e6f672bd48
2025-02-21 20:07:22 +01:00

38 lines
1.0 KiB
Rust

use std::{
fs::File,
io::{self, prelude::*},
os::unix::io::{AsRawFd, FromRawFd, RawFd}
};
fn from_syscall_error(error: syscall::Error) -> io::Error {
io::Error::from_raw_os_error(error.errno as i32)
}
fn dup(file: &File, buf: &str) -> io::Result<File> {
let stream = syscall::dup(file.as_raw_fd() as usize, buf.as_bytes()).map_err(from_syscall_error)?;
Ok(unsafe { File::from_raw_fd(stream as RawFd) })
}
fn main() -> io::Result<()> {
let mut buf = [0; 5];
let server = File::create("chan:")?;
let mut client = dup(&server, "connect")?;
let mut stream = dup(&server, "listen")?;
println!("Testing basic I/O...");
stream.write(b"abc")?;
stream.flush()?;
println!("-> Wrote message");
assert_eq!(client.read(&mut buf)?, 3);
assert_eq!(&buf[..3], b"abc");
println!("-> Read message");
println!("Testing connecting to unnamed socket by name (makes no sense)...");
assert_eq!(File::open("chan:").unwrap_err().kind(), io::ErrorKind::NotFound);
println!("Everything tested!");
Ok(())
}