summary refs log tree commit diff
path: root/vm_control
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2020-03-25 08:38:01 +0000
committerAlyssa Ross <hi@alyssa.is>2020-06-15 09:37:12 +0000
commitb6549a605935e29ab0ae4291737f8b0158bca1fb (patch)
tree7f4242993ce003cb787b242a264e3b8ea47e3430 /vm_control
parent2885f9ca1a79d30421deeb025e92ae0118fc6d3a (diff)
downloadcrosvm-b6549a605935e29ab0ae4291737f8b0158bca1fb.tar
crosvm-b6549a605935e29ab0ae4291737f8b0158bca1fb.tar.gz
crosvm-b6549a605935e29ab0ae4291737f8b0158bca1fb.tar.bz2
crosvm-b6549a605935e29ab0ae4291737f8b0158bca1fb.tar.lz
crosvm-b6549a605935e29ab0ae4291737f8b0158bca1fb.tar.xz
crosvm-b6549a605935e29ab0ae4291737f8b0158bca1fb.tar.zst
crosvm-b6549a605935e29ab0ae4291737f8b0158bca1fb.zip
recursive deserialization
Diffstat (limited to 'vm_control')
-rw-r--r--vm_control/Cargo.toml1
-rw-r--r--vm_control/src/lib.rs16
2 files changed, 11 insertions, 6 deletions
diff --git a/vm_control/Cargo.toml b/vm_control/Cargo.toml
index 3a6ec3f..8bde359 100644
--- a/vm_control/Cargo.toml
+++ b/vm_control/Cargo.toml
@@ -10,6 +10,5 @@ kvm = { path = "../kvm" }
 libc = "*"
 msg_socket = { path = "../msg_socket" }
 msg_socket2 = { path = "../msg_socket2" }
-msg_socket2_derive = { path = "../msg_socket2/derive" }
 resources = { path = "../resources" }
 sys_util = { path = "../sys_util" }
diff --git a/vm_control/src/lib.rs b/vm_control/src/lib.rs
index 3ec6be7..99fae7e 100644
--- a/vm_control/src/lib.rs
+++ b/vm_control/src/lib.rs
@@ -20,22 +20,22 @@ use libc::{EINVAL, EIO, ENODEV};
 
 use kvm::{IrqRoute, IrqSource, Vm};
 use msg_socket::{MsgError, MsgOnSocket, MsgResult, MsgSocket, UnixSeqpacketExt};
-use msg_socket2_derive::SerializeWithFds;
+use msg_socket2::{DeserializeWithFds, SerializeWithFds};
 use resources::{Alloc, GpuMemoryDesc, MmioType, SystemAllocator};
 use sys_util::net::UnixSeqpacket;
 use sys_util::{error, Error as SysError, EventFd, GuestAddress, MemoryMapping, MmapError, Result};
 
 /// A data structure that either owns or borrows a file descriptor.
-#[derive(SerializeWithFds, Debug)]
+#[derive(Debug, DeserializeWithFds, SerializeWithFds)]
 #[msg_socket2(strategy = "AsRawFd")]
-pub enum MaybeOwnedFd<Owned: AsRawFd> {
+pub enum MaybeOwnedFd<Owned: AsRawFd + FromRawFd> {
     /// Owned by this enum variant, and will be destructed automatically if not moved out.
     Owned(Owned),
     /// A file descriptor borrwed by this enum.
     Borrowed(RawFd),
 }
 
-impl<Owned: AsRawFd> MaybeOwnedFd<Owned> {
+impl<Owned: AsRawFd + FromRawFd> MaybeOwnedFd<Owned> {
     pub fn new_borrowed(fd: &dyn AsRawFd) -> Self {
         Self::Borrowed(fd.as_raw_fd())
     }
@@ -48,7 +48,7 @@ impl<Owned: AsRawFd> MaybeOwnedFd<Owned> {
     }
 }
 
-impl<Owned: AsRawFd> AsRawFd for MaybeOwnedFd<Owned> {
+impl<Owned: AsRawFd + FromRawFd> AsRawFd for MaybeOwnedFd<Owned> {
     fn as_raw_fd(&self) -> RawFd {
         match self {
             MaybeOwnedFd::Owned(f) => f.as_raw_fd(),
@@ -57,6 +57,12 @@ impl<Owned: AsRawFd> AsRawFd for MaybeOwnedFd<Owned> {
     }
 }
 
+impl<Owned: AsRawFd + FromRawFd> FromRawFd for MaybeOwnedFd<Owned> {
+    unsafe fn from_raw_fd(fd: RawFd) -> Self {
+        Self::Owned(Owned::from_raw_fd(fd))
+    }
+}
+
 // When sent, it could be owned or borrowed. On the receiver end, it always owned.
 impl<Owned: AsRawFd + FromRawFd + MsgOnSocket> MsgOnSocket for MaybeOwnedFd<Owned> {
     fn uses_fd() -> bool {