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 |
#470 in Unix APIs
26,058 downloads per month
Used in 15 crates
(3 directly)
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–8.5MB
~70K SLoC