summary refs log tree commit diff
path: root/msg_socket
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2020-03-26 09:03:39 +0000
committerAlyssa Ross <hi@alyssa.is>2020-06-15 09:37:19 +0000
commit353b1d9091b9095282463f36e26643506e2d2897 (patch)
tree714c613f9140cfebd45a3308ff2f035b0bb10958 /msg_socket
parente682f11cd0d063fe9111b13ab8ecff676592acdb (diff)
downloadcrosvm-353b1d9091b9095282463f36e26643506e2d2897.tar
crosvm-353b1d9091b9095282463f36e26643506e2d2897.tar.gz
crosvm-353b1d9091b9095282463f36e26643506e2d2897.tar.bz2
crosvm-353b1d9091b9095282463f36e26643506e2d2897.tar.lz
crosvm-353b1d9091b9095282463f36e26643506e2d2897.tar.xz
crosvm-353b1d9091b9095282463f36e26643506e2d2897.tar.zst
crosvm-353b1d9091b9095282463f36e26643506e2d2897.zip
use lifetimes in serialization to prevent closing
Diffstat (limited to 'msg_socket')
-rw-r--r--msg_socket/Cargo.toml1
-rw-r--r--msg_socket/src/lib.rs11
2 files changed, 11 insertions, 1 deletions
diff --git a/msg_socket/Cargo.toml b/msg_socket/Cargo.toml
index 80eba0b..030b7d3 100644
--- a/msg_socket/Cargo.toml
+++ b/msg_socket/Cargo.toml
@@ -10,5 +10,6 @@ data_model = { path = "../data_model" }
 futures = "*"
 libc = "*"
 msg_on_socket_derive = { path = "msg_on_socket_derive" }
+msg_socket2 = { path = "../msg_socket2" }
 sys_util = { path = "../sys_util"  }
 sync = { path = "../sync"  }
diff --git a/msg_socket/src/lib.rs b/msg_socket/src/lib.rs
index be86070..5dedac8 100644
--- a/msg_socket/src/lib.rs
+++ b/msg_socket/src/lib.rs
@@ -6,7 +6,7 @@ mod msg_on_socket;
 
 use std::io::{IoSlice, Result};
 use std::marker::PhantomData;
-use std::os::unix::io::{AsRawFd, RawFd};
+use std::os::unix::prelude::*;
 use std::pin::Pin;
 use std::task::{Context, Poll};
 
@@ -14,6 +14,7 @@ use futures::Stream;
 use libc::{EWOULDBLOCK, O_NONBLOCK};
 
 use cros_async::add_read_waker;
+use msg_socket2::{DeserializeWithFds, SerializeWithFds};
 use sys_util::{
     add_fd_flags, clear_fd_flags, error, handle_eintr, net::UnixSeqpacket, Error as SysError,
     ScmSocket,
@@ -33,6 +34,8 @@ pub fn pair<Request: MsgOnSocket, Response: MsgOnSocket>(
 }
 
 /// Bidirection sock that support both send and recv.
+#[derive(SerializeWithFds, DeserializeWithFds)]
+#[msg_socket2(strategy = "AsRawFd")]
 pub struct MsgSocket<I: MsgOnSocket, O: MsgOnSocket> {
     sock: UnixSeqpacket,
     _i: PhantomData<I>,
@@ -99,6 +102,12 @@ impl<I: MsgOnSocket, O: MsgOnSocket> AsRawFd for MsgSocket<I, O> {
     }
 }
 
+impl<I: MsgOnSocket, O: MsgOnSocket> FromRawFd for MsgSocket<I, O> {
+    unsafe fn from_raw_fd(fd: RawFd) -> Self {
+        Self::new(UnixSeqpacket::from_raw_fd(fd))
+    }
+}
+
 impl<M: MsgOnSocket> AsRef<UnixSeqpacket> for Sender<M> {
     fn as_ref(&self) -> &UnixSeqpacket {
         &self.sock