@@ -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,38 @@ impl AsRawFd for net::TcpListener {
71
74
}
72
75
}
73
76
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
+
74
86
impl 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 {
76
90
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 ) ) )
79
93
}
80
94
}
81
95
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
+
82
103
impl 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 {
84
107
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 ) ) ;
86
109
net:: TcpListener :: from_inner ( sys:: net:: TcpListener :: from_inner ( socket) )
87
110
}
88
111
}
0 commit comments