about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2020-11-24 03:12:20 +0000
committerbors <bors@rust-lang.org>2020-11-24 03:12:20 +0000
commit4167d731dcaed3a37217f8850b27d30cbde5f15b (patch)
tree75f87e5793b3e36e33f3a1d2932e12f0fa92ed21
parentcb5b87133a9b1d4489c1326a5cc3942e4345fcf9 (diff)
parent084b0da933c2430e2ef80ae0e00ddf76e2bc5f10 (diff)
downloadrust-4167d731dcaed3a37217f8850b27d30cbde5f15b.tar.gz
rust-4167d731dcaed3a37217f8850b27d30cbde5f15b.zip
Auto merge of #78953 - mzohreva:mz/from_raw_fd, r=Mark-Simulacrum
Add Metadata in std::os::fortanix_sgx::io::FromRawFd

Needed for https://github.com/fortanix/rust-sgx/pull/291

cc `@jethrogb`
-rw-r--r--library/std/src/sys/sgx/ext/io.rs39
-rw-r--r--library/std/src/sys/sgx/net.rs6
2 files changed, 35 insertions, 10 deletions
diff --git a/library/std/src/sys/sgx/ext/io.rs b/library/std/src/sys/sgx/ext/io.rs
index f79874a4aec..795a4d190cf 100644
--- a/library/std/src/sys/sgx/ext/io.rs
+++ b/library/std/src/sys/sgx/ext/io.rs
@@ -25,8 +25,11 @@ pub trait AsRawFd {
 /// descriptor.
 #[unstable(feature = "sgx_platform", issue = "56975")]
 pub trait FromRawFd {
+    /// An associated type that contains relevant metadata for `Self`.
+    type Metadata: Default;
+
     /// Constructs a new instance of `Self` from the given raw file
-    /// descriptor.
+    /// descriptor and metadata.
     ///
     /// This function **consumes ownership** of the specified file
     /// descriptor. The returned object will take responsibility for closing
@@ -38,7 +41,7 @@ pub trait FromRawFd {
     /// accidentally allow violating this contract which can cause memory
     /// unsafety in code that relies on it being true.
     #[unstable(feature = "sgx_platform", issue = "56975")]
-    unsafe fn from_raw_fd(fd: RawFd) -> Self;
+    unsafe fn from_raw_fd(fd: RawFd, metadata: Self::Metadata) -> Self;
 }
 
 /// A trait to express the ability to consume an object and acquire ownership of
@@ -71,18 +74,40 @@ impl AsRawFd for net::TcpListener {
     }
 }
 
+/// Metadata for `TcpStream`.
+#[derive(Debug, Clone, Default)]
+#[unstable(feature = "sgx_platform", issue = "56975")]
+pub struct TcpStreamMetadata {
+    /// Local address of the TCP stream
+    pub local_addr: Option<String>,
+    /// Peer address of the TCP stream
+    pub peer_addr: Option<String>,
+}
+
 impl FromRawFd for net::TcpStream {
-    unsafe fn from_raw_fd(fd: RawFd) -> net::TcpStream {
+    type Metadata = TcpStreamMetadata;
+
+    unsafe fn from_raw_fd(fd: RawFd, metadata: Self::Metadata) -> net::TcpStream {
         let fd = sys::fd::FileDesc::from_inner(fd);
-        let socket = sys::net::Socket::from_inner(fd);
-        net::TcpStream::from_inner(sys::net::TcpStream::from_inner((socket, None)))
+        let socket = sys::net::Socket::from_inner((fd, metadata.local_addr));
+        net::TcpStream::from_inner(sys::net::TcpStream::from_inner((socket, metadata.peer_addr)))
     }
 }
 
+/// Metadata for `TcpListener`.
+#[derive(Debug, Clone, Default)]
+#[unstable(feature = "sgx_platform", issue = "56975")]
+pub struct TcpListenerMetadata {
+    /// Local address of the TCP listener
+    pub local_addr: Option<String>,
+}
+
 impl FromRawFd for net::TcpListener {
-    unsafe fn from_raw_fd(fd: RawFd) -> net::TcpListener {
+    type Metadata = TcpListenerMetadata;
+
+    unsafe fn from_raw_fd(fd: RawFd, metadata: Self::Metadata) -> net::TcpListener {
         let fd = sys::fd::FileDesc::from_inner(fd);
-        let socket = sys::net::Socket::from_inner(fd);
+        let socket = sys::net::Socket::from_inner((fd, metadata.local_addr));
         net::TcpListener::from_inner(sys::net::TcpListener::from_inner(socket))
     }
 }
diff --git a/library/std/src/sys/sgx/net.rs b/library/std/src/sys/sgx/net.rs
index 666a157b09c..3dd8267921e 100644
--- a/library/std/src/sys/sgx/net.rs
+++ b/library/std/src/sys/sgx/net.rs
@@ -37,9 +37,9 @@ impl TryIntoInner<FileDesc> for Socket {
     }
 }
 
-impl FromInner<FileDesc> for Socket {
-    fn from_inner(inner: FileDesc) -> Socket {
-        Socket { inner: Arc::new(inner), local_addr: None }
+impl FromInner<(FileDesc, Option<String>)> for Socket {
+    fn from_inner((inner, local_addr): (FileDesc, Option<String>)) -> Socket {
+        Socket { inner: Arc::new(inner), local_addr }
     }
 }