use sfifo::Sfifo;
use std::time::Duration;
use tokio::time::sleep;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();
let fifo_path = "/tmp/cross_process_auth_demo";
let auth_token = "secure_cross_process_token_2024";
println!("๐ฅ๏ธ Authenticated FIFO server starting...");
println!("๐ FIFO path: {}", fifo_path);
println!("๐ Waiting for client connection...");
cleanup_fifos(fifo_path).await;
let mut sfifo = Sfifo::new(fifo_path);
sfifo.set_create(true);
match sfifo.open_authenticated_receiver(auth_token).await {
Ok(mut auth_fifo) => {
let peer = auth_fifo.peer_info();
println!("โ
Client authentication successful!");
println!(" Client process ID: {}", peer.process_id);
println!(" Client process name: {}", peer.process_name);
println!(" Authentication timestamp: {}", peer.timestamp);
println!("\n๐ฌ Starting message communication...");
for i in 1..=5 {
let mut buffer = vec![0u8; 1024];
match auth_fifo.read(&mut buffer).await {
Ok(n) => {
buffer.truncate(n);
let message = String::from_utf8_lossy(&buffer);
println!("๐จ Received message #{}: {}", i, message.trim());
}
Err(e) => {
eprintln!("โ Failed to read message: {}", e);
break;
}
}
sleep(Duration::from_millis(500)).await;
}
println!("\nโ
Server communication completed");
}
Err(e) => {
eprintln!("โ Server authentication failed: {}", e);
return Err(e.into());
}
}
cleanup_fifos(fifo_path).await;
println!("๐งน Resource cleanup completed");
Ok(())
}
async fn cleanup_fifos(base_path: &str) {
let paths = [
format!("{}.c2s", base_path),
format!("{}.s2c", base_path),
base_path.to_string(),
];
for path in &paths {
let _ = tokio::fs::remove_file(path).await;
}
}