summary refs log tree commit diff
path: root/src/main.rs
diff options
context:
space:
mode:
authorZach Reizner <zachr@google.com>2019-03-18 20:58:31 -0700
committerchrome-bot <chrome-bot@chromium.org>2019-04-27 01:36:47 -0700
commitaff94ca6da90b92503558b6ba7aa68e1180afd87 (patch)
tree74fc34c90d1f6e10e6e921dddea389bdd51ad3e6 /src/main.rs
parentd99cd0ae0b21d29d4e5145b889f97e9f6cd11b69 (diff)
downloadcrosvm-aff94ca6da90b92503558b6ba7aa68e1180afd87.tar
crosvm-aff94ca6da90b92503558b6ba7aa68e1180afd87.tar.gz
crosvm-aff94ca6da90b92503558b6ba7aa68e1180afd87.tar.bz2
crosvm-aff94ca6da90b92503558b6ba7aa68e1180afd87.tar.lz
crosvm-aff94ca6da90b92503558b6ba7aa68e1180afd87.tar.xz
crosvm-aff94ca6da90b92503558b6ba7aa68e1180afd87.tar.zst
crosvm-aff94ca6da90b92503558b6ba7aa68e1180afd87.zip
usb: support for listing attached usb devices
Originally, crosvm would list details about an attached usb device for a
given port. This change allows getting details about multiple ports at
once. This is intended to simplify command line usage and downstream
consumers like concierge.

TEST=various vmc commands
     Chrome UI for handling USB devices
BUG=chromium:831850

Change-Id: I55681a7fea7425c897a22a579dcc15567683ef54
Reviewed-on: https://chromium-review.googlesource.com/1529765
Commit-Ready: Zach Reizner <zachr@chromium.org>
Tested-by: Zach Reizner <zachr@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs20
1 files changed, 9 insertions, 11 deletions
diff --git a/src/main.rs b/src/main.rs
index b5ba7e7..48c1edd 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -28,7 +28,7 @@ use sys_util::{
 };
 use vm_control::{
     BalloonControlCommand, DiskControlCommand, MaybeOwnedFd, UsbControlCommand, UsbControlResult,
-    VmControlRequestSocket, VmRequest, VmResponse,
+    VmControlRequestSocket, VmRequest, VmResponse, USB_CONTROL_MAX_PORTS,
 };
 
 use crate::argument::{print_help, set_arguments, Argument};
@@ -1105,14 +1105,12 @@ fn usb_detach(mut args: std::env::Args) -> ModifyUsbResult<UsbControlResult> {
     }
 }
 
-fn usb_list(mut args: std::env::Args) -> ModifyUsbResult<UsbControlResult> {
-    let port: u8 = args
-        .next()
-        .map_or(Err(ModifyUsbError::ArgMissing("PORT")), |p| {
-            p.parse::<u8>()
-                .map_err(|e| ModifyUsbError::ArgParseInt("PORT", p.to_owned(), e))
-        })?;
-    let request = VmRequest::UsbCommand(UsbControlCommand::ListDevice { port });
+fn usb_list(args: std::env::Args) -> ModifyUsbResult<UsbControlResult> {
+    let mut ports: [u8; USB_CONTROL_MAX_PORTS] = Default::default();
+    for (index, port) in ports.iter_mut().enumerate() {
+        *port = index as u8
+    }
+    let request = VmRequest::UsbCommand(UsbControlCommand::ListDevice { ports });
     let response = handle_request(&request, args).map_err(|_| ModifyUsbError::SocketFailed)?;
     match response {
         VmResponse::UsbResponse(usb_resp) => Ok(usb_resp),
@@ -1121,9 +1119,9 @@ fn usb_list(mut args: std::env::Args) -> ModifyUsbResult<UsbControlResult> {
 }
 
 fn modify_usb(mut args: std::env::Args) -> std::result::Result<(), ()> {
-    if args.len() < 3 {
+    if args.len() < 2 {
         print_help("crosvm usb",
-                   "[attach BUS_ID:ADDR:VENDOR_ID:PRODUCT_ID [USB_DEVICE_PATH|-] | detach PORT | list PORT] VM_SOCKET...", &[]);
+                   "[attach BUS_ID:ADDR:VENDOR_ID:PRODUCT_ID [USB_DEVICE_PATH|-] | detach PORT | list] VM_SOCKET...", &[]);
         return Err(());
     }