Merge remote-tracking branch 'upstream/master' into HEAD

Pull in warning fixes for Rust 1.53+.

BUG=None
TEST=cargo test --all-features

Change-Id: Idd7a8d5bceee304e7667c62e0f878c373ea47929
diff --git a/Cargo.toml b/Cargo.toml
index a9bfe83..b5cb22d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "vhost"
+name = "vmm_vhost"
 version = "0.1.0"
 keywords = ["vhost", "vhost-user", "virtio", "vdpa"]
 description = "a pure rust library for vdpa, vhost and vhost-user"
@@ -21,10 +21,13 @@
 [dependencies]
 bitflags = ">=1.0.1"
 libc = ">=0.2.39"
-
-vmm-sys-util = ">=0.3.1"
+sys_util = "*"
+tempfile = "*"
 vm-memory = { version = "0.2.0", optional = true }
 
 [dev-dependencies]
-tempfile = ">=3.2.0"
 vm-memory = { version = "0.2.0", features=["backend-mmap"] }
+
+[patch.crates-io]
+sys_util = { path = "../../../platform/crosvm/sys_util" } # ignored by ebuild
+tempfile = { path = "../../../platform/crosvm/tempfile" } # ignored by ebuild
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..3ec308a
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,4 @@
+chirantan@chromium.org
+dgreid@chromium.org
+keiichiw@chromium.org
+woodychow@chromium.org
diff --git a/PRESUBMIT.cfg b/PRESUBMIT.cfg
new file mode 100644
index 0000000..e52636e
--- /dev/null
+++ b/PRESUBMIT.cfg
@@ -0,0 +1,6 @@
+[Hook Overrides]
+cargo_clippy_check: true
+
+[Hook Overrides Options]
+cargo_clippy_check:
+  --project=.
diff --git a/src/backend.rs b/src/backend.rs
index 89fde50..1ae306f 100644
--- a/src/backend.rs
+++ b/src/backend.rs
@@ -13,7 +13,7 @@
 use std::os::unix::io::RawFd;
 use std::sync::RwLock;
 
-use vmm_sys_util::eventfd::EventFd;
+use sys_util::EventFd;
 
 use super::Result;
 
@@ -470,7 +470,7 @@
         b.set_vring_base(1, 2).unwrap();
         assert_eq!(b.get_vring_base(1).unwrap(), 2);
 
-        let eventfd = EventFd::new(0).unwrap();
+        let eventfd = EventFd::new().unwrap();
         b.set_vring_call(1, &eventfd).unwrap();
         b.set_vring_kick(1, &eventfd).unwrap();
         b.set_vring_err(1, &eventfd).unwrap();
diff --git a/src/lib.rs b/src/lib.rs
index 83d8782..db1680a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -35,7 +35,7 @@
 #[cfg_attr(feature = "vhost-user", macro_use)]
 extern crate bitflags;
 #[cfg_attr(feature = "vhost-kern", macro_use)]
-extern crate vmm_sys_util;
+extern crate sys_util;
 
 mod backend;
 pub use backend::*;
diff --git a/src/vhost_kern/mod.rs b/src/vhost_kern/mod.rs
index f82cbfc..5daca51 100644
--- a/src/vhost_kern/mod.rs
+++ b/src/vhost_kern/mod.rs
@@ -13,9 +13,9 @@
 
 use std::os::unix::io::{AsRawFd, RawFd};
 
+use sys_util::ioctl::{ioctl, ioctl_with_mut_ref, ioctl_with_ptr, ioctl_with_ref};
+use sys_util::EventFd;
 use vm_memory::{Address, GuestAddress, GuestAddressSpace, GuestMemory, GuestUsize};
-use vmm_sys_util::eventfd::EventFd;
-use vmm_sys_util::ioctl::{ioctl, ioctl_with_mut_ref, ioctl_with_ptr, ioctl_with_ref};
 
 use super::{
     Error, Result, VhostBackend, VhostUserMemoryRegionInfo, VringConfigData,
diff --git a/src/vhost_kern/vsock.rs b/src/vhost_kern/vsock.rs
index 65f89e4..388d500 100644
--- a/src/vhost_kern/vsock.rs
+++ b/src/vhost_kern/vsock.rs
@@ -11,8 +11,8 @@
 use std::os::unix::fs::OpenOptionsExt;
 use std::os::unix::io::{AsRawFd, RawFd};
 
+use sys_util::ioctl_with_ref;
 use vm_memory::GuestAddressSpace;
-use vmm_sys_util::ioctl::ioctl_with_ref;
 
 use super::vhost_binding::{VHOST_VSOCK_SET_GUEST_CID, VHOST_VSOCK_SET_RUNNING};
 use super::{ioctl_result, Error, Result, VhostKernBackend};
@@ -78,13 +78,15 @@
 
 #[cfg(test)]
 mod tests {
+    use sys_util::EventFd;
     use vm_memory::{GuestAddress, GuestMemory, GuestMemoryMmap};
-    use vmm_sys_util::eventfd::EventFd;
 
     use super::*;
     use crate::{VhostBackend, VhostUserMemoryRegionInfo, VringConfigData};
 
+    // Ignore all tests because /dev/vhost-vsock is unavailable in Chrome OS chroot.
     #[test]
+    #[ignore]
     fn test_vsock_new_device() {
         let m = GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 0x10_0000)]).unwrap();
         let vsock = Vsock::new(&m).unwrap();
@@ -95,6 +97,7 @@
     }
 
     #[test]
+    #[ignore]
     fn test_vsock_is_valid() {
         let m = GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 0x10_0000)]).unwrap();
         let vsock = Vsock::new(&m).unwrap();
@@ -119,6 +122,7 @@
     }
 
     #[test]
+    #[ignore]
     fn test_vsock_ioctls() {
         let m = GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 0x10_0000)]).unwrap();
         let vsock = Vsock::new(&m).unwrap();
@@ -153,7 +157,7 @@
         vsock.set_log_base(0x4000, Some(1)).unwrap_err();
         vsock.set_log_base(0x4000, None).unwrap();
 
-        let eventfd = EventFd::new(0).unwrap();
+        let eventfd = EventFd::new().unwrap();
         vsock.set_log_fd(eventfd.as_raw_fd()).unwrap();
 
         vsock.set_vring_num(0, 32).unwrap();
diff --git a/src/vhost_user/connection.rs b/src/vhost_user/connection.rs
index ead84c5..ea8461a 100644
--- a/src/vhost_user/connection.rs
+++ b/src/vhost_user/connection.rs
@@ -14,7 +14,7 @@
 use std::{mem, slice};
 
 use libc::{c_void, iovec};
-use vmm_sys_util::sock_ctrl_msg::ScmSocket;
+use sys_util::ScmSocket;
 
 use super::message::*;
 use super::{Error, Result};
@@ -127,7 +127,7 @@
             Some(rfds) => rfds,
             _ => &[],
         };
-        self.sock.send_with_fds(iovs, rfds).map_err(Into::into)
+        self.sock.send_bufs_with_fds(iovs, rfds).map_err(Into::into)
     }
 
     /// Sends all bytes from scatter-gather vectors over the socket with optional attached file
@@ -297,11 +297,7 @@
     /// * - SocketError: other socket related errors.
     pub fn recv_data(&mut self, len: usize) -> Result<(usize, Vec<u8>)> {
         let mut rbuf = vec![0u8; len];
-        let mut iovs = [iovec {
-            iov_base: rbuf.as_mut_ptr() as *mut c_void,
-            iov_len: len,
-        }];
-        let (bytes, _) = self.sock.recv_with_fds(&mut iovs, &mut [])?;
+        let (bytes, _) = self.sock.recv_with_fds(&mut rbuf[..], &mut [])?;
         Ok((bytes, rbuf))
     }
 
@@ -325,7 +321,7 @@
     /// * - SocketError: other socket related errors.
     pub fn recv_into_iovec(&mut self, iovs: &mut [iovec]) -> Result<(usize, Option<Vec<File>>)> {
         let mut fd_array = vec![0; MAX_ATTACHED_FD_ENTRIES];
-        let (bytes, fds) = self.sock.recv_with_fds(iovs, &mut fd_array)?;
+        let (bytes, fds) = self.sock.recv_iovecs_with_fds(iovs, &mut fd_array)?;
 
         let files = match fds {
             0 => None,
@@ -609,19 +605,18 @@
 mod tests {
     use super::*;
     use std::io::{Read, Seek, SeekFrom, Write};
-    use vmm_sys_util::rand::rand_alphanumerics;
-    use vmm_sys_util::tempfile::TempFile;
+    use std::os::unix::io::FromRawFd;
+    use tempfile::{tempfile, Builder, TempDir};
 
-    fn temp_path() -> PathBuf {
-        PathBuf::from(format!(
-            "/tmp/vhost_test_{}",
-            rand_alphanumerics(8).to_str().unwrap()
-        ))
+    fn temp_dir() -> TempDir {
+        Builder::new().prefix("/tmp/vhost_test").tempdir().unwrap()
     }
 
     #[test]
     fn create_listener() {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let listener = Listener::new(&path, true).unwrap();
 
         assert!(listener.as_raw_fd() > 0);
@@ -629,7 +624,9 @@
 
     #[test]
     fn accept_connection() {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let listener = Listener::new(&path, true).unwrap();
         listener.set_nonblocking(true).unwrap();
 
@@ -640,7 +637,9 @@
 
     #[test]
     fn send_data() {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let listener = Listener::new(&path, true).unwrap();
         listener.set_nonblocking(true).unwrap();
         let mut master = Endpoint::<MasterReq>::connect(&path).unwrap();
@@ -666,14 +665,16 @@
 
     #[test]
     fn send_fd() {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let listener = Listener::new(&path, true).unwrap();
         listener.set_nonblocking(true).unwrap();
         let mut master = Endpoint::<MasterReq>::connect(&path).unwrap();
         let sock = listener.accept().unwrap().unwrap();
         let mut slave = Endpoint::<MasterReq>::from_stream(sock);
 
-        let mut fd = TempFile::new().unwrap().into_file();
+        let mut fd = tempfile().unwrap();
         write!(fd, "test").unwrap();
 
         // Normal case for sending/receiving file descriptors
@@ -817,7 +818,9 @@
 
     #[test]
     fn send_recv() {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let listener = Listener::new(&path, true).unwrap();
         listener.set_nonblocking(true).unwrap();
         let mut master = Endpoint::<MasterReq>::connect(&path).unwrap();
diff --git a/src/vhost_user/master.rs b/src/vhost_user/master.rs
index ff0454a..9a65fbe 100644
--- a/src/vhost_user/master.rs
+++ b/src/vhost_user/master.rs
@@ -10,7 +10,7 @@
 use std::path::Path;
 use std::sync::{Arc, Mutex, MutexGuard};
 
-use vmm_sys_util::eventfd::EventFd;
+use sys_util::EventFd;
 
 use super::connection::Endpoint;
 use super::message::*;
@@ -764,15 +764,10 @@
 mod tests {
     use super::super::connection::Listener;
     use super::*;
-    use vmm_sys_util::rand::rand_alphanumerics;
+    use tempfile::{Builder, TempDir};
 
-    use std::path::PathBuf;
-
-    fn temp_path() -> PathBuf {
-        PathBuf::from(format!(
-            "/tmp/vhost_test_{}",
-            rand_alphanumerics(8).to_str().unwrap()
-        ))
+    fn temp_dir() -> TempDir {
+        Builder::new().prefix("/tmp/vhost_test").tempdir().unwrap()
     }
 
     fn create_pair<P: AsRef<Path>>(path: P) -> (Master, Endpoint<MasterReq>) {
@@ -785,7 +780,9 @@
 
     #[test]
     fn create_master() {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let listener = Listener::new(&path, true).unwrap();
         listener.set_nonblocking(true).unwrap();
 
@@ -812,7 +809,9 @@
 
     #[test]
     fn test_create_failure() {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let _ = Listener::new(&path, true).unwrap();
         let _ = Listener::new(&path, false).is_err();
         assert!(Master::connect(&path, 1).is_err());
@@ -827,7 +826,9 @@
 
     #[test]
     fn test_features() {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let (master, mut peer) = create_pair(&path);
 
         master.set_owner().unwrap();
@@ -862,7 +863,9 @@
 
     #[test]
     fn test_protocol_features() {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let (mut master, mut peer) = create_pair(&path);
 
         master.set_owner().unwrap();
@@ -913,7 +916,9 @@
 
     #[test]
     fn test_master_set_config_negative() {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let (mut master, _peer) = create_pair(&path);
         let buf = vec![0x0; MAX_MSG_SIZE + 1];
 
@@ -958,7 +963,9 @@
     }
 
     fn create_pair2() -> (Master, Endpoint<MasterReq>) {
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let (master, peer) = create_pair(&path);
 
         {
diff --git a/src/vhost_user/mod.rs b/src/vhost_user/mod.rs
index 99d6f80..5d8ce31 100644
--- a/src/vhost_user/mod.rs
+++ b/src/vhost_user/mod.rs
@@ -131,10 +131,10 @@
     }
 }
 
-impl std::convert::From<vmm_sys_util::errno::Error> for Error {
+impl std::convert::From<sys_util::Error> for Error {
     /// Convert raw socket errors into meaningful vhost-user errors.
     ///
-    /// The vmm_sys_util::errno::Error is a simple wrapper over the raw errno, which doesn't means
+    /// The sys_util::Error is a simple wrapper over the raw errno, which doesn't means
     /// much to the vhost-user connection manager. So convert it into meaningful errors to simplify
     /// the connection manager logic.
     ///
@@ -143,7 +143,7 @@
     /// * - Error::SocketBroken: the underline socket is broken.
     /// * - Error::SocketError: other socket related errors.
     #[allow(unreachable_patterns)] // EWOULDBLOCK equals to EGAIN on linux
-    fn from(err: vmm_sys_util::errno::Error) -> Self {
+    fn from(err: sys_util::Error) -> Self {
         match err.errno() {
             // The socket is marked nonblocking and the requested operation would block.
             libc::EAGAIN => Error::SocketRetry(IOError::from_raw_os_error(libc::EAGAIN)),
@@ -191,25 +191,20 @@
 
 #[cfg(all(test, feature = "vhost-user-master", feature = "vhost-user-slave"))]
 mod tests {
-    use std::fs::File;
     use std::os::unix::io::AsRawFd;
-    use std::path::{Path, PathBuf};
+    use std::path::Path;
     use std::sync::{Arc, Barrier, Mutex};
     use std::thread;
-    use vmm_sys_util::rand::rand_alphanumerics;
-    use vmm_sys_util::tempfile::TempFile;
 
     use super::dummy_slave::{DummySlaveReqHandler, VIRTIO_FEATURES};
     use super::message::*;
     use super::*;
     use crate::backend::VhostBackend;
     use crate::{VhostUserMemoryRegionInfo, VringConfigData};
+    use tempfile::{tempfile, Builder, TempDir};
 
-    fn temp_path() -> PathBuf {
-        PathBuf::from(format!(
-            "/tmp/vhost_test_{}",
-            rand_alphanumerics(8).to_str().unwrap()
-        ))
+    fn temp_dir() -> TempDir {
+        Builder::new().prefix("/tmp/vhost_test").tempdir().unwrap()
     }
 
     fn create_slave<P, S>(path: P, backend: Arc<S>) -> (Master, SlaveReqHandler<S>)
@@ -234,7 +229,9 @@
     #[test]
     fn test_set_owner() {
         let slave_be = Arc::new(Mutex::new(DummySlaveReqHandler::new()));
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let (master, mut slave) = create_slave(&path, slave_be.clone());
 
         assert_eq!(slave_be.lock().unwrap().owned, false);
@@ -250,7 +247,9 @@
     fn test_set_features() {
         let mbar = Arc::new(Barrier::new(2));
         let sbar = mbar.clone();
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let slave_be = Arc::new(Mutex::new(DummySlaveReqHandler::new()));
         let (mut master, mut slave) = create_slave(&path, slave_be.clone());
 
@@ -294,7 +293,9 @@
     fn test_master_slave_process() {
         let mbar = Arc::new(Barrier::new(2));
         let sbar = mbar.clone();
-        let path = temp_path();
+        let dir = temp_dir();
+        let mut path = dir.path().to_owned();
+        path.push("sock");
         let slave_be = Arc::new(Mutex::new(DummySlaveReqHandler::new()));
         let (mut master, mut slave) = create_slave(&path, slave_be.clone());
 
@@ -391,7 +392,7 @@
         let num = master.get_queue_num().unwrap();
         assert_eq!(num, 2);
 
-        let eventfd = vmm_sys_util::eventfd::EventFd::new(0).unwrap();
+        let eventfd = sys_util::EventFd::new().unwrap();
         let mem = [VhostUserMemoryRegionInfo {
             guest_phys_addr: 0,
             memory_size: 0x10_0000,
@@ -438,7 +439,7 @@
         let max_mem_slots = master.get_max_mem_slots().unwrap();
         assert_eq!(max_mem_slots, 32);
 
-        let region_file: File = TempFile::new().unwrap().into_file();
+        let region_file = tempfile().unwrap();
         let region = VhostUserMemoryRegionInfo {
             guest_phys_addr: 0x10_0000,
             memory_size: 0x10_0000,
@@ -474,7 +475,7 @@
 
     #[test]
     fn test_error_from_sys_util_error() {
-        let e: Error = vmm_sys_util::errno::Error::new(libc::EAGAIN).into();
+        let e: Error = sys_util::Error::new(libc::EAGAIN).into();
         if let Error::SocketRetry(e1) = e {
             assert_eq!(e1.raw_os_error().unwrap(), libc::EAGAIN);
         } else {