asyncio/local/
seq_packet.rs

1use prelude::{Protocol, Endpoint};
2use ffi::{AF_UNIX, SOCK_SEQPACKET};
3use seq_packet_socket::{SeqPacketSocket};
4use socket_listener::{SocketListener};
5use local::{LocalProtocol, LocalEndpoint};
6
7use std::fmt;
8use std::mem;
9
10/// The seq-packet protocol.
11///
12/// # Example
13/// Create a server and client sockets.
14///
15/// ```rust,no_run
16/// use asyncio::{IoContext, Endpoint};
17/// use asyncio::local::{LocalSeqPacket, LocalSeqPacketEndpoint, LocalSeqPacketSocket, LocalSeqPacketListener};
18///
19/// let ctx = &IoContext::new().unwrap();
20/// let ep = LocalSeqPacketEndpoint::new("example.sock").unwrap();
21///
22/// let sv = LocalSeqPacketListener::new(ctx, LocalSeqPacket).unwrap();
23/// sv.bind(&ep).unwrap();
24/// sv.listen().unwrap();
25///
26/// let cl = LocalSeqPacketSocket::new(ctx, ep.protocol()).unwrap();
27/// cl.connect(&ep).unwrap();
28/// ```
29#[derive(Clone, Eq, PartialEq, Ord, PartialOrd)]
30pub struct LocalSeqPacket;
31
32impl Protocol for LocalSeqPacket {
33    type Endpoint = LocalEndpoint<Self>;
34
35    fn family_type(&self) -> i32 {
36        AF_UNIX
37    }
38
39    fn socket_type(&self) -> i32 {
40        SOCK_SEQPACKET
41    }
42
43    fn protocol_type(&self) -> i32 {
44        0
45    }
46
47    unsafe fn uninitialized(&self) -> Self::Endpoint {
48        mem::uninitialized()
49    }
50}
51
52impl LocalProtocol for LocalSeqPacket {
53    type Socket = SeqPacketSocket<Self>;
54}
55
56impl Endpoint<LocalSeqPacket> for LocalEndpoint<LocalSeqPacket> {
57    fn protocol(&self) -> LocalSeqPacket {
58        LocalSeqPacket
59    }
60}
61
62impl fmt::Debug for LocalSeqPacket {
63    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
64        write!(f, "LocalSeqPacket")
65    }
66}
67
68impl fmt::Debug for LocalEndpoint<LocalSeqPacket> {
69    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
70        write!(f, "LocalEndpoint(SeqPacket:\"{}\")", self)
71    }
72}
73
74/// The seq-packet endpoint type.
75pub type LocalSeqPacketEndpoint = LocalEndpoint<LocalSeqPacket>;
76
77/// The seq-packet socket type.
78pub type LocalSeqPacketSocket = SeqPacketSocket<LocalSeqPacket>;
79
80/// The seq-packet listener type.
81pub type LocalSeqPacketListener = SocketListener<LocalSeqPacket, SeqPacketSocket<LocalSeqPacket>>;
82
83#[test]
84fn test_seq_packet() {
85    assert!(LocalSeqPacket == LocalSeqPacket);
86}
87
88#[test]
89#[cfg(target_os = "linux")]
90fn test_format() {
91    use core::IoContext;
92
93    let ctx = &IoContext::new().unwrap();
94    println!("{:?}", LocalSeqPacket);
95    println!("{:?}", LocalSeqPacketEndpoint::new("foo/bar").unwrap());
96    println!("{:?}", LocalSeqPacketSocket::new(ctx, LocalSeqPacket).unwrap());
97}