summary refs log tree commit diff
path: root/vm_control/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vm_control/src/lib.rs')
-rw-r--r--vm_control/src/lib.rs16
1 files changed, 11 insertions, 5 deletions
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 {