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

#330 in Unix APIs

Download history 817/week @ 2024-01-07 828/week @ 2024-01-14 941/week @ 2024-01-21 1123/week @ 2024-01-28 1588/week @ 2024-02-04 1925/week @ 2024-02-11 1849/week @ 2024-02-18 1862/week @ 2024-02-25 1682/week @ 2024-03-03 1464/week @ 2024-03-10 4807/week @ 2024-03-17 4140/week @ 2024-03-24 2720/week @ 2024-03-31 2899/week @ 2024-04-07 2477/week @ 2024-04-14 2055/week @ 2024-04-21

10,203 downloads per month
Used in 3 crates

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–13MB
~89K SLoC