@@ -25,8 +25,11 @@ pub trait AsRawFd {
25
25
/// descriptor.
26
26
#[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
27
27
pub trait FromRawFd {
28
+ /// An associated type that contains relevant metadata for `Self`.
29
+ type Metadata : Default ;
30
+
28
31
/// Constructs a new instance of `Self` from the given raw file
29
- /// descriptor.
32
+ /// descriptor and metadata .
30
33
///
31
34
/// This function **consumes ownership** of the specified file
32
35
/// descriptor. The returned object will take responsibility for closing
@@ -38,7 +41,7 @@ pub trait FromRawFd {
38
41
/// accidentally allow violating this contract which can cause memory
39
42
/// unsafety in code that relies on it being true.
40
43
#[ 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 ;
42
45
}
43
46
44
47
/// A trait to express the ability to consume an object and acquire ownership of
@@ -71,18 +74,40 @@ impl AsRawFd for net::TcpListener {
71
74
}
72
75
}
73
76
77
+ /// Metadata for `TcpStream`.
78
+ #[ derive( Debug , Clone , Default ) ]
79
+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
80
+ pub struct TcpStreamMetadata {
81
+ /// Local address of the TCP stream
82
+ pub local_addr : Option < String > ,
83
+ /// Peer address of the TCP stream
84
+ pub peer_addr : Option < String > ,
85
+ }
86
+
74
87
impl FromRawFd for net:: TcpStream {
75
- unsafe fn from_raw_fd ( fd : RawFd ) -> net:: TcpStream {
88
+ type Metadata = TcpStreamMetadata ;
89
+
90
+ unsafe fn from_raw_fd ( fd : RawFd , metadata : Self :: Metadata ) -> net:: TcpStream {
76
91
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 ) ) )
92
+ let socket = sys:: net:: Socket :: from_inner ( ( fd , metadata . local_addr ) ) ;
93
+ net:: TcpStream :: from_inner ( sys:: net:: TcpStream :: from_inner ( ( socket, metadata . peer_addr ) ) )
79
94
}
80
95
}
81
96
97
+ /// Metadata for `TcpListener`.
98
+ #[ derive( Debug , Clone , Default ) ]
99
+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
100
+ pub struct TcpListenerMetadata {
101
+ /// Local address of the TCP listener
102
+ pub local_addr : Option < String > ,
103
+ }
104
+
82
105
impl FromRawFd for net:: TcpListener {
83
- unsafe fn from_raw_fd ( fd : RawFd ) -> net:: TcpListener {
106
+ type Metadata = TcpListenerMetadata ;
107
+
108
+ unsafe fn from_raw_fd ( fd : RawFd , metadata : Self :: Metadata ) -> net:: TcpListener {
84
109
let fd = sys:: fd:: FileDesc :: from_inner ( fd) ;
85
- let socket = sys:: net:: Socket :: from_inner ( fd ) ;
110
+ let socket = sys:: net:: Socket :: from_inner ( ( fd , metadata . local_addr ) ) ;
86
111
net:: TcpListener :: from_inner ( sys:: net:: TcpListener :: from_inner ( socket) )
87
112
}
88
113
}
0 commit comments