7 releases
0.1.6 | Feb 24, 2023 |
---|---|
0.1.5 | Dec 3, 2022 |
0.1.4 | May 14, 2020 |
0.1.3 | Apr 13, 2020 |
0.1.1 | Mar 13, 2019 |
#342 in Unix APIs
12,151 downloads per month
Used in 2 crates
39KB
355 lines
passfd
Unix sockets possess magic ability to transfer file descriptors from one process to another (unrelated) process using
obscure SCM_RIGHTS
API. This little crate adds extension methods to UnixStream to use it.
Links
- fd-passing same thing, different API
- Good article on fd passing
lib.rs
:
passfd
allows passing file descriptors between unrelated processes
using Unix sockets.
Both tokio 0.1 and 0.2 are supported with tokio_01
and tokio_02
features. Please note that these features rely on internal representation
of UnixStream and are unsafe.
Example usage
Process 1 (sender)
use passfd::FdPassingExt;
use std::fs::File;
use std::os::unix::io::AsRawFd;
use std::os::unix::net::UnixListener;
let file = File::open("/etc/passwd").unwrap();
let listener = UnixListener::bind("/tmp/test.sock").unwrap();
let (stream, _) = listener.accept().unwrap();
stream.send_fd(file.as_raw_fd()).unwrap();
Process 2 (receiver)
use passfd::FdPassingExt;
use std::fs::File;
use std::io::Read;
use std::os::unix::io::FromRawFd;
use std::os::unix::net::UnixStream;
let stream = UnixStream::connect("/tmp/test.sock").unwrap();
let fd = stream.recv_fd().unwrap();
let mut file = unsafe { File::from_raw_fd(fd) };
let mut buf = String::new();
file.read_to_string(&mut buf).unwrap();
println!("{}", buf);
Dependencies
~0–11MB
~82K SLoC