1#![allow(clippy::module_name_repetitions)]
8
9use core::net::Ipv4Addr;
10use psp::sys::{in_addr, sockaddr};
11
12use super::netc;
13
14pub mod error;
15#[cfg(feature = "macros")]
16pub mod macros;
17mod sce;
18pub mod state;
19pub mod tcp;
20pub mod tls;
21pub mod udp;
22
23fn socket_addr_v4_to_sockaddr(addr: SocketAddrV4) -> sockaddr {
25 let octets = addr.ip().octets();
26 let sin_addr = u32::from_le_bytes(octets);
27 let port = addr.port().to_be();
28
29 let sockaddr_in = netc::sockaddr_in {
30 sin_len: core::mem::size_of::<netc::sockaddr_in>() as u8,
31 sin_family: netc::AF_INET,
32 sin_port: port,
33 sin_addr: netc::in_addr(sin_addr),
34 sin_zero: [0u8; 8],
35 };
36
37 unsafe { core::mem::transmute::<netc::sockaddr_in, netc::sockaddr>(sockaddr_in) }
38}
39
40pub trait ToSockaddr {
42 fn to_sockaddr(&self) -> sockaddr;
44}
45
46impl ToSockaddr for SocketAddrV4 {
47 fn to_sockaddr(&self) -> sockaddr {
48 socket_addr_v4_to_sockaddr(*self)
49 }
50}
51
52pub trait ToSocketAddr {
54 fn to_socket_addr(&self) -> SocketAddr;
56}
57
58impl ToSocketAddr for in_addr {
59 fn to_socket_addr(&self) -> SocketAddr {
60 let octets = self.0.to_be_bytes();
61 let ip = Ipv4Addr::new(octets[0], octets[1], octets[2], octets[3]);
62 SocketAddr::V4(SocketAddrV4::new(ip, 0))
63 }
64}
65
66impl ToSocketAddr for sockaddr {
67 fn to_socket_addr(&self) -> SocketAddr {
68 let sockaddr_in =
69 unsafe { core::mem::transmute::<netc::sockaddr, netc::sockaddr_in>(*self) };
70
71 let octets = sockaddr_in.sin_addr.0.to_be_bytes();
72
73 let port = u16::to_be(sockaddr_in.sin_port);
74
75 SocketAddr::V4(SocketAddrV4::new(
76 Ipv4Addr::new(octets[0], octets[1], octets[2], octets[3]),
77 port,
78 ))
79 }
80}
81
82pub type SocketAddr = core::net::SocketAddr;
84pub type SocketAddrV4 = core::net::SocketAddrV4;