From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yw1-f171.google.com (mail-yw1-f171.google.com [209.85.128.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB00A1C8FB1 for ; Wed, 12 Aug 2026 06:39:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786516771; cv=none; b=Me9k5LUZqh7agQVzICuNqVU/4Ebl9yhyJnhZEZCmddinNrUKOrCz1OMJj/HKsRjg30AtTcZddTryjq2dst0hz+3SSyTdSn4FDscHn8SpMMbt2YObs5+VgVrYSjmQ+oHQtx5+IV3GoQEVWSZ5M/hfJ6hG79ueZpp+l2DSQMmROoM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786516771; c=relaxed/simple; bh=vjGh686wZ4pA8kDIgwRcV9cVvfwN2GaRDI0zRt1vvS0=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=AJ9ZOlBPQhzpyUm620ay5slHZxcY50fy5HAsB31/X3IICLXXfv6JLqM/A/KmwaCrQ9uMHuh53B/AC1QaaIEMBE97UqEBqXj5lKMctTQkx9x54qdeeO3qdJuL6WY7w4m0RZXRFIs+QLEVRin7m+da/CIBYppOwQ3ciHM59GePM2I= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=cmAafOHF; arc=none smtp.client-ip=209.85.128.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cmAafOHF" Received: by mail-yw1-f171.google.com with SMTP id 00721157ae682-81e69a2db34so9895847b3.0 for ; Tue, 11 Aug 2026 23:39:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786516769; x=1787121569; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=KPNQJW0gliM+4l6OgCS07iChqzAnkwEPHIHVmPErM0U=; b=cmAafOHFBtOXGjEwM/UUwEF8ls620wwVI1K3Ta+bF95NYhld1A8xXjX4m1TaRFidsl kC83pKRp7ypNO7BDyJd421cnPKI1U+wxYlbG/HyxcTk7pDdBkxYkRH89pWEubVkAj4Il dkr6LyZJV078t+Yj/S8s3D3TM+fE85UhQExwCSPly2vXd5SYtkicFXfaUsLSm7KkKOxd /glqlIT8l7wSnn8e0y0VCQonQUsot73Ou+xCb8zU/+zf9TyVr3lmSIkCLW2bqs4wSY/c 0u/pD+cJ0aPeHtKMoHngXQkdRy7IjHAoJ4y2JWUbP6hGYaBtv+x8dvaSdVsAkmIEZGMv ygWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786516769; x=1787121569; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=KPNQJW0gliM+4l6OgCS07iChqzAnkwEPHIHVmPErM0U=; b=F53h8j888nZMiEGdk387OsOCf/5Vx13R8Hnc/eO8D2KkXpieNZwHVn+gkod8wpJ8Tu 5baH1pSlQLZ9M98gdFr7cl7fRO/QR8O3JIrokOAD7RPcMWYEYn1YFQ2o7kRRr2h5V0eH v9b5Jli/HOnND7GsKSHkrC11RqPMXbRohsJLM28KGOcQ26ns7LsEZSsaJKeYAEggDyA8 yTk0ZGc+1IZxo2x75BmLQrKOxCngz7VhWYSiwvI7X9QG8X5MrvPd9LkJszbtViL8T6mT 8Ut1ao6df9ld/HkFTf3uWJ1QEDUvCo/DUXfhXrTDThJSeMk62g0yD7wEVsd95hnVn6x7 gKfg== X-Forwarded-Encrypted: i=1; AHgh+Rqzh+mKz2hs78do3yTfP1ljjWpHmH6SJfLfM8rQkU8UfRiGZ2bJ8AgxvFxcKtoLYUFMWlK/WkrtXcEkfbw=@vger.kernel.org X-Gm-Message-State: AOJu0YxZJcj86xSDU/A48GNQMV12A0uNILOlDuZeonLTIubEH2k4c7P5 HTBYK/xIJniu4CTAkzzb/REyQBvJ13A8hJ4d53G6IZ6KWF/umov6JmPX X-Gm-Gg: AR+sD11DfEakLcmOWwvUAwo6OQ97qbllL6bs8gTk1FcpZggLl1O3CyoXipQ1pYaQN52 aqo6qWeAEZfNjLJBuKi+qShUGT5KdmPCMVFJJQ8vcQWymRRRiJmm3RFPMocT5EpWMqCpoEdX04G /OYEEWLhRkwxqFeheYaOLT72OGyjco0CP/fP3yqvqCYrFW2HDnhcVv+t0zdKMmLlVgUHgQxISMs pFm78pxJn0iQulyM4MUW/DGFQX1B7ePL3ymXK02QSjWxI8epCWuLaT+if0XzpQrVrCyBh//P+gR LSPXheyF4GedLeOw2qL+UCJtZS6SgyWNvZ3ERqorfiCYqEhTRZKCn0S5EKzbrNYIF4Fld6DQPdm cgPc9Ia4Gs1h6lh6sJftrxB9UfG739Zx30/TIab9f/5wAdVBngDwGuJPjaloGLgLgp4dBE6X+8Y gKsxNyBOqnbd8SLCitHtpe5TvQMjagtRuKVUoY/BzFf9em6gtLZNO11itHbuGjKSQJkFTShaqa9 J0E5mgFanPwNpJFxmc07Smdldq1fPH/3LJLXpRPRjW7Uxhdypr3QGl7Qz5leEteSB89Rx1fgx5U aeDgeUEDPTZ62pYPvqyCYKLbvQfnr2ql9Z9+iscAgliV9w8D4H6v+faVFRZG7vVSHzvar6+DFzB 64P+mUDoHMEK+2LkiOKxxR41zTg0LBDG5ACd5 X-Received: by 2002:a05:690c:61c3:b0:81f:650d:1377 with SMTP id 00721157ae682-8310c7cf860mr15850457b3.35.1786516768571; Tue, 11 Aug 2026 23:39:28 -0700 (PDT) Received: from localhost.localdomain (c-76-108-143-213.hsd1.fl.comcast.net. [76.108.143.213]) by smtp.gmail.com with ESMTPSA id 00721157ae682-830abb2e076sm8226137b3.47.2026.08.11.23.39.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 23:39:28 -0700 (PDT) From: Jason Colapietro To: Valentina Manea , Shuah Khan , Shuah Khan Cc: Hongren Zheng , Greg KH , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 RESEND 1/2] usbip: make remote list honor parsable output Date: Wed, 12 Aug 2026 02:39:09 -0400 Message-ID: <20260812063910.31293-1-jasoncola1@gmail.com> X-Mailer: git-send-email 2.50.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The -p option only affects local devices and gadgets. Remote lists still print their human-readable headings and details, so scripts cannot parse them using the documented option. Pass the parsable flag through the remote listing path. Emit the same busid and usbid record used for local devices while continuing to consume every interface record from the server. Fixes: e9837bbb3e69 ("staging: usbip: userspace tools v1.0.0") Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219502 Cc: stable@vger.kernel.org Assisted-by: Codex:gpt-5 Signed-off-by: Jason Colapietro --- tools/usb/usbip/src/usbip_list.c | 33 ++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/tools/usb/usbip/src/usbip_list.c b/tools/usb/usbip/src/usbip_list.c index 3d810bcca..b9d60b87e 100644 --- a/tools/usb/usbip/src/usbip_list.c +++ b/tools/usb/usbip/src/usbip_list.c @@ -41,7 +41,7 @@ void usbip_list_usage(void) printf("usage: %s", usbip_list_usage_string); } -static int get_exported_devices(char *host, int sockfd) +static int get_exported_devices(char *host, int sockfd, bool parsable) { char product_name[100]; char class_name[100]; @@ -80,9 +80,11 @@ static int get_exported_devices(char *host, int sockfd) return 0; } - printf("Exportable USB devices\n"); - printf("======================\n"); - printf(" - %s\n", host); + if (!parsable) { + printf("Exportable USB devices\n"); + printf("======================\n"); + printf(" - %s\n", host); + } for (i = 0; i < reply.ndev; i++) { memset(&udev, 0, sizeof(udev)); @@ -98,9 +100,14 @@ static int get_exported_devices(char *host, int sockfd) usbip_names_get_class(class_name, sizeof(class_name), udev.bDeviceClass, udev.bDeviceSubClass, udev.bDeviceProtocol); - printf("%11s: %s\n", udev.busid, product_name); - printf("%11s: %s\n", "", udev.path); - printf("%11s: %s\n", "", class_name); + if (parsable) { + printf("busid=%s#usbid=%04x:%04x#\n", udev.busid, + udev.idVendor, udev.idProduct); + } else { + printf("%11s: %s\n", udev.busid, product_name); + printf("%11s: %s\n", "", udev.path); + printf("%11s: %s\n", "", class_name); + } for (j = 0; j < udev.bNumInterfaces; j++) { rc = usbip_net_recv(sockfd, &uintf, sizeof(uintf)); @@ -116,16 +123,18 @@ static int get_exported_devices(char *host, int sockfd) uintf.bInterfaceClass, uintf.bInterfaceSubClass, uintf.bInterfaceProtocol); - printf("%11s: %2d - %s\n", "", j, class_name); + if (!parsable) + printf("%11s: %2d - %s\n", "", j, class_name); } - printf("\n"); + if (!parsable) + printf("\n"); } return 0; } -static int list_exported_devices(char *host) +static int list_exported_devices(char *host, bool parsable) { int rc; int sockfd; @@ -138,7 +147,7 @@ static int list_exported_devices(char *host) } dbg("connected to %s:%s", host, usbip_port_string); - rc = get_exported_devices(host, sockfd); + rc = get_exported_devices(host, sockfd, parsable); if (rc < 0) { err("failed to get device list from %s", host); return -1; @@ -351,7 +360,7 @@ int usbip_list(int argc, char *argv[]) parsable = true; break; case 'r': - ret = list_exported_devices(optarg); + ret = list_exported_devices(optarg, parsable); goto out; case 'l': ret = list_devices(parsable); -- 2.50.1 (Apple Git-155)