summary refs log tree commit diff
path: root/usb_util
diff options
context:
space:
mode:
authorJingkui Wang <jkwang@google.com>2019-03-06 21:19:03 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-03-08 21:20:18 -0800
commitb07540c7f99055fa7037b098f451e894e8c03e16 (patch)
tree100a2612b2556cfa53eb14bba9b0808955289a32 /usb_util
parent9deb7d7803f6354b4edd0f8293a096994866c50b (diff)
downloadcrosvm-b07540c7f99055fa7037b098f451e894e8c03e16.tar
crosvm-b07540c7f99055fa7037b098f451e894e8c03e16.tar.gz
crosvm-b07540c7f99055fa7037b098f451e894e8c03e16.tar.bz2
crosvm-b07540c7f99055fa7037b098f451e894e8c03e16.tar.lz
crosvm-b07540c7f99055fa7037b098f451e894e8c03e16.tar.xz
crosvm-b07540c7f99055fa7037b098f451e894e8c03e16.tar.zst
crosvm-b07540c7f99055fa7037b098f451e894e8c03e16.zip
usb_util: Add libusb jailed api
This patch add bindings for libusb_init_jailed, and
libusb_get_device_from_fd.

TEST=run crosvm locally
BUG=chromium:831850

Change-Id: I948594c8293b185bd873fd98b497ea9171b84c86
Reviewed-on: https://chromium-review.googlesource.com/1506826
Commit-Ready: Zach Reizner <zachr@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'usb_util')
-rw-r--r--usb_util/src/bindings.rs10
-rw-r--r--usb_util/src/libusb_context.rs28
2 files changed, 38 insertions, 0 deletions
diff --git a/usb_util/src/bindings.rs b/usb_util/src/bindings.rs
index d64ebed..99c0cde 100644
--- a/usb_util/src/bindings.rs
+++ b/usb_util/src/bindings.rs
@@ -4008,9 +4008,19 @@ extern "C" {
     pub fn libusb_init(ctx: *mut *mut libusb_context) -> ::std::os::raw::c_int;
 }
 extern "C" {
+    pub fn libusb_init_jailed(ctx: *mut *mut libusb_context) -> ::std::os::raw::c_int;
+}
+extern "C" {
     pub fn libusb_exit(ctx: *mut libusb_context);
 }
 extern "C" {
+    pub fn libusb_get_device_from_fd(
+        ctx: *mut libusb_context,
+        fd: ::std::os::raw::c_int,
+        device: *mut *mut libusb_device,
+    ) -> ::std::os::raw::c_int;
+}
+extern "C" {
     pub fn libusb_set_debug(ctx: *mut libusb_context, level: ::std::os::raw::c_int);
 }
 extern "C" {
diff --git a/usb_util/src/libusb_context.rs b/usb_util/src/libusb_context.rs
index b9f2f1a..4fdf04f 100644
--- a/usb_util/src/libusb_context.rs
+++ b/usb_util/src/libusb_context.rs
@@ -65,6 +65,34 @@ impl LibUsbContext {
         })
     }
 
+    /// Create a new jailed LibUsbContext.
+    #[cfg(feature = "sandboxed-libusb")]
+    pub fn new_jailed() -> Result<LibUsbContext> {
+        let mut ctx: *mut bindings::libusb_context = std::ptr::null_mut();
+        // Safe because '&mut ctx' points to a valid memory (on stack).
+        try_libusb!(unsafe { bindings::libusb_init_jailed(&mut ctx) });
+        Ok(LibUsbContext {
+            inner: Arc::new(LibUsbContextInner {
+                context: ctx,
+                pollfd_change_handler: Mutex::new(None),
+            }),
+        })
+    }
+
+    /// Build device from File.
+    #[cfg(feature = "sandboxed-libusb")]
+    pub fn get_device_from_fd(&self, fd: std::fs::File) -> Result<LibUsbDevice> {
+        use std::os::unix::io::IntoRawFd;
+
+        let fd = fd.into_raw_fd();
+        let mut device: *mut bindings::libusb_device = std::ptr::null_mut();
+        // Safe because fd is valid and owned, and '&mut device' points to valid memory.
+        try_libusb!(unsafe {
+            bindings::libusb_get_device_from_fd(self.inner.context, fd, &mut device)
+        });
+        unsafe { Ok(LibUsbDevice::new(self.inner.clone(), device)) }
+    }
+
     /// Returns a list of USB devices currently attached to the system.
     pub fn get_device_iter(&self) -> Result<DeviceIter> {
         let mut list: *mut *mut bindings::libusb_device = std::ptr::null_mut();