dfir_rs/util/
socket.rs

1use tokio::net::UnixStream;
2use tokio::net::unix::{OwnedReadHalf, OwnedWriteHalf};
3use tokio_util::codec::{
4    BytesCodec, Decoder, FramedRead, FramedWrite, LengthDelimitedCodec, LinesCodec,
5};
6
7/// Helper creates a Unix `Stream` and `Sink` from the given socket, using the given `Codec` to
8/// handle delineation between inputs/outputs.
9pub fn unix_framed<Codec>(
10    stream: UnixStream,
11    codec: Codec,
12) -> (
13    FramedWrite<OwnedWriteHalf, Codec>,
14    FramedRead<OwnedReadHalf, Codec>,
15)
16where
17    Codec: Clone + Decoder,
18{
19    let (recv, send) = stream.into_split();
20    let send = FramedWrite::new(send, codec.clone());
21    let recv = FramedRead::new(recv, codec);
22    (send, recv)
23}
24
25/// Helper creates a Unix `Stream` and `Sink` for `Bytes` strings where each string is
26/// length-delimited.
27pub fn unix_bytes(
28    stream: UnixStream,
29) -> (
30    FramedWrite<OwnedWriteHalf, LengthDelimitedCodec>,
31    FramedRead<OwnedReadHalf, LengthDelimitedCodec>,
32) {
33    unix_framed(stream, LengthDelimitedCodec::new())
34}
35
36/// Helper creates a Unix `Stream` and `Sink` for undelimited streams of `Bytes`.
37pub fn unix_bytestream(
38    stream: UnixStream,
39) -> (
40    FramedWrite<OwnedWriteHalf, BytesCodec>,
41    FramedRead<OwnedReadHalf, BytesCodec>,
42) {
43    unix_framed(stream, BytesCodec::new())
44}
45
46/// Helper creates a Unix `Stream` and `Sink` for `str`ings delimited by newlines.
47pub fn unix_lines(
48    stream: UnixStream,
49) -> (
50    FramedWrite<OwnedWriteHalf, LinesCodec>,
51    FramedRead<OwnedReadHalf, LinesCodec>,
52) {
53    unix_framed(stream, LinesCodec::new())
54}