diff options
author | Jingkui Wang <jkwang@google.com> | 2019-03-06 21:19:03 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-03-08 21:20:18 -0800 |
commit | b07540c7f99055fa7037b098f451e894e8c03e16 (patch) | |
tree | 100a2612b2556cfa53eb14bba9b0808955289a32 /usb_util | |
parent | 9deb7d7803f6354b4edd0f8293a096994866c50b (diff) | |
download | crosvm-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.rs | 10 | ||||
-rw-r--r-- | usb_util/src/libusb_context.rs | 28 |
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(); |