@@ -25,8 +25,11 @@ pub trait AsRawFd {
2525/// descriptor.
2626#[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
2727pub trait FromRawFd {
28+ /// An associated type that contains relevant metadata for `Self`.
29+ type Metadata : Default ;
30+
2831 /// Constructs a new instance of `Self` from the given raw file
29- /// descriptor.
32+ /// descriptor and metadata .
3033 ///
3134 /// This function **consumes ownership** of the specified file
3235 /// descriptor. The returned object will take responsibility for closing
@@ -38,7 +41,7 @@ pub trait FromRawFd {
3841 /// accidentally allow violating this contract which can cause memory
3942 /// unsafety in code that relies on it being true.
4043 #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
41- unsafe fn from_raw_fd ( fd : RawFd ) -> Self ;
44+ unsafe fn from_raw_fd ( fd : RawFd , metadata : Self :: Metadata ) -> Self ;
4245}
4346
4447/// A trait to express the ability to consume an object and acquire ownership of
@@ -71,18 +74,38 @@ impl AsRawFd for net::TcpListener {
7174 }
7275}
7376
77+ /// Metadata for `TcpStream`.
78+ #[ derive( Debug , Clone , Default ) ]
79+ pub struct TcpStreamMetadata {
80+ /// Local address of the TCP stream
81+ pub local_addr : Option < String > ,
82+ /// Peer address of the TCP stream
83+ pub peer_addr : Option < String > ,
84+ }
85+
7486impl FromRawFd for net:: TcpStream {
75- unsafe fn from_raw_fd ( fd : RawFd ) -> net:: TcpStream {
87+ type Metadata = TcpStreamMetadata ;
88+
89+ unsafe fn from_raw_fd ( fd : RawFd , metadata : Self :: Metadata ) -> net:: TcpStream {
7690 let fd = sys:: fd:: FileDesc :: from_inner ( fd) ;
77- let socket = sys:: net:: Socket :: from_inner ( fd ) ;
78- net:: TcpStream :: from_inner ( sys:: net:: TcpStream :: from_inner ( ( socket, None ) ) )
91+ let socket = sys:: net:: Socket :: from_inner ( ( fd , metadata . local_addr ) ) ;
92+ net:: TcpStream :: from_inner ( sys:: net:: TcpStream :: from_inner ( ( socket, metadata . peer_addr ) ) )
7993 }
8094}
8195
96+ /// Metadata for `TcpListener`.
97+ #[ derive( Debug , Clone , Default ) ]
98+ pub struct TcpListenerMetadata {
99+ /// Local address of the TCP listener
100+ pub local_addr : Option < String > ,
101+ }
102+
82103impl FromRawFd for net:: TcpListener {
83- unsafe fn from_raw_fd ( fd : RawFd ) -> net:: TcpListener {
104+ type Metadata = TcpListenerMetadata ;
105+
106+ unsafe fn from_raw_fd ( fd : RawFd , metadata : Self :: Metadata ) -> net:: TcpListener {
84107 let fd = sys:: fd:: FileDesc :: from_inner ( fd) ;
85- let socket = sys:: net:: Socket :: from_inner ( fd ) ;
108+ let socket = sys:: net:: Socket :: from_inner ( ( fd , metadata . local_addr ) ) ;
86109 net:: TcpListener :: from_inner ( sys:: net:: TcpListener :: from_inner ( socket) )
87110 }
88111}
0 commit comments