summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2020-03-08 22:41:30 +0000
committerAlyssa Ross <hi@alyssa.is>2020-06-15 09:36:14 +0000
commit2507cc57bc0145eb57305e60f6a7c21f3b4c9192 (patch)
treea6b700b920b6b2733ae8049302c613d3eb93a330 /src
parent3d1bc2e0bb5bae7f32a9fa18b5348295facd5ab6 (diff)
downloadcrosvm-2507cc57bc0145eb57305e60f6a7c21f3b4c9192.tar
crosvm-2507cc57bc0145eb57305e60f6a7c21f3b4c9192.tar.gz
crosvm-2507cc57bc0145eb57305e60f6a7c21f3b4c9192.tar.bz2
crosvm-2507cc57bc0145eb57305e60f6a7c21f3b4c9192.tar.lz
crosvm-2507cc57bc0145eb57305e60f6a7c21f3b4c9192.tar.xz
crosvm-2507cc57bc0145eb57305e60f6a7c21f3b4c9192.tar.zst
crosvm-2507cc57bc0145eb57305e60f6a7c21f3b4c9192.zip
vm_control: make MaybeOwnedFd generic
This will allow more easily sending types other than File over
sockets, (e.g., UnixSeqpacket).
Diffstat (limited to 'src')
-rw-r--r--src/wl.rs53
1 files changed, 12 insertions, 41 deletions
diff --git a/src/wl.rs b/src/wl.rs
index 419fb67..b35af8b 100644
--- a/src/wl.rs
+++ b/src/wl.rs
@@ -1,15 +1,10 @@
 // SPDX-License-Identifier: BSD-3-Clause
 
-use std::os::unix::prelude::*;
-
 use devices::virtio::{InterruptProxy, InterruptProxyEvent, SingleFd, Worker};
 use msg_socket::{MsgReceiver, MsgSocket};
 use std::collections::BTreeMap;
 use std::fs::remove_file;
-use sys_util::{
-    net::{UnixSeqpacket, UnixSeqpacketListener},
-    EventFd, GuestMemory, SharedMemory,
-};
+use sys_util::{net::UnixSeqpacketListener, GuestMemory};
 use vm_control::VmMemoryControlRequestSocket;
 
 #[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
@@ -36,7 +31,7 @@ fn main() {
     loop {
         match msg_socket.recv() {
             Ok(SingleFd {
-                memfd,
+                shm,
                 interrupt,
                 interrupt_resample_evt,
                 in_queue,
@@ -47,8 +42,7 @@ fn main() {
                 out_queue_evt,
                 kill_evt,
             }) => {
-                let shm = unsafe { SharedMemory::from_raw_fd(memfd.as_raw_fd()) };
-                std::mem::forget(memfd);
+                let shm = shm.owned();
 
                 let regions = arch_memory_regions(MemoryParams {
                     size: shm.size(),
@@ -57,27 +51,19 @@ fn main() {
                 let mem =
                     GuestMemory::with_memfd(&regions, shm).expect("GuestMemory::with_memfd failed");
 
-                let interrupt: MsgSocket<InterruptProxyEvent, ()> = MsgSocket::new(unsafe {
-                    let sock = UnixSeqpacket::from_raw_fd(interrupt.as_raw_fd());
-                    std::mem::forget(interrupt);
-                    sock
-                });
-                let vm_socket: VmMemoryControlRequestSocket = MsgSocket::new(unsafe {
-                    let sock = UnixSeqpacket::from_raw_fd(vm_socket.as_raw_fd());
-                    std::mem::forget(vm_socket);
-                    sock
-                });
+                let interrupt: MsgSocket<InterruptProxyEvent, ()> =
+                    MsgSocket::new(interrupt.owned());
+                let vm_socket: VmMemoryControlRequestSocket = MsgSocket::new(vm_socket.owned());
 
                 let mut wayland_paths = BTreeMap::new();
                 wayland_paths.insert("".into(), "/run/user/1000/wayland-0".into());
 
                 let mut worker = Worker::new(
                     mem,
-                    Box::new(InterruptProxy::new(interrupt, unsafe {
-                        let evt = EventFd::from_raw_fd(interrupt_resample_evt.as_raw_fd());
-                        std::mem::forget(interrupt_resample_evt);
-                        evt
-                    })),
+                    Box::new(InterruptProxy::new(
+                        interrupt,
+                        interrupt_resample_evt.owned(),
+                    )),
                     in_queue,
                     out_queue,
                     wayland_paths,
@@ -87,23 +73,8 @@ fn main() {
                 );
 
                 worker.run(
-                    vec![
-                        unsafe {
-                            let evt = EventFd::from_raw_fd(in_queue_evt.as_raw_fd());
-                            std::mem::forget(in_queue_evt);
-                            evt
-                        },
-                        unsafe {
-                            let evt = EventFd::from_raw_fd(out_queue_evt.as_raw_fd());
-                            std::mem::forget(out_queue_evt);
-                            evt
-                        },
-                    ],
-                    unsafe {
-                        let evt = EventFd::from_raw_fd(kill_evt.as_raw_fd());
-                        std::mem::forget(kill_evt);
-                        evt
-                    },
+                    vec![in_queue_evt.owned(), out_queue_evt.owned()],
+                    kill_evt.owned(),
                 );
             }