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

#530 in Unix APIs

Download history 3610/week @ 2024-07-20 3265/week @ 2024-07-27 3107/week @ 2024-08-03 4061/week @ 2024-08-10 3737/week @ 2024-08-17 5049/week @ 2024-08-24 5096/week @ 2024-08-31 6086/week @ 2024-09-07 8356/week @ 2024-09-14 6986/week @ 2024-09-21 7120/week @ 2024-09-28 5997/week @ 2024-10-05 4188/week @ 2024-10-12 9156/week @ 2024-10-19 7859/week @ 2024-10-26 4457/week @ 2024-11-02

26,262 downloads per month
Used in 15 crates (3 directly)

MIT license

39KB
355 lines

passfd

Build Status

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.


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
~71K SLoC