From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chunyan Liu Subject: [PATCH V6 4/7] libxl: add libxl_device_usb_assignable_list API Date: Mon, 10 Aug 2015 18:35:25 +0800 Message-ID: <1439202928-24813-5-git-send-email-cyliu@suse.com> References: <1439202928-24813-1-git-send-email-cyliu@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1439202928-24813-1-git-send-email-cyliu@suse.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: jgross@suse.com, wei.liu2@citrix.com, ian.campbell@citrix.com, george.dunlap@eu.citrix.com, Ian.Jackson@eu.citrix.com, Chunyan Liu , jfehlig@suse.com List-Id: xen-devel@lists.xenproject.org Add API for listing assignable USB devices info. Assignable USB device means the USB device type is assignable and it's not assigned to any guest yet. Signed-off-by: Chunyan Liu --- This could be squashed with previous patch. Split because there is some dispute on this. If this is acceptable, could be squashed, otherwise could be removed. tools/libxl/libxl.h | 3 +++ tools/libxl/libxl_pvusb.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 05b6331..d1360ce 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -1433,6 +1433,9 @@ int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_usbctrlinfo *usbctrlinfo); /* USB Devices */ +libxl_device_usb * +libxl_device_usb_assignable_list(libxl_ctx *ctx, int *num); + int libxl_device_usb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_usb *usb, const libxl_asyncop_how *ao_how) LIBXL_EXTERNAL_CALLERS_ONLY; diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c index d4c4c03..e56fa07 100644 --- a/tools/libxl/libxl_pvusb.c +++ b/tools/libxl/libxl_pvusb.c @@ -552,6 +552,59 @@ static bool is_usb_assignable(libxl__gc *gc, libxl_device_usb *usb) return classcode != USBHUB_CLASS_CODE; } +libxl_device_usb * +libxl_device_usb_assignable_list(libxl_ctx *ctx, int *num) +{ + GC_INIT(ctx); + libxl_device_usb *usbs = NULL; + libxl_device_usb *assigned; + int num_assigned; + struct dirent *de; + DIR *dir; + + *num = 0; + + if (libxl__device_usb_assigned_list(gc, &assigned, &num_assigned) < 0) + goto out; + + if (!(dir = opendir(SYSFS_USB_DEV))) + goto out; + + while ((de = readdir(dir))) { + libxl_device_usb *usb; + int bus = -1, addr = -1; + + if (!de->d_name) + continue; + + usb_busaddr_from_busid(gc, de->d_name, &bus, &addr); + if (bus < 1 || addr < 1) + continue; + + GCNEW(usb); + usb->u.hostdev.hostbus = bus; + usb->u.hostdev.hostaddr = addr; + + if (!is_usb_assignable(gc, usb)) + continue; + + if (is_usb_in_array(assigned, num_assigned, usb)) + continue; + + usbs = libxl__realloc(NOGC, usbs, sizeof(*usbs) * (*num + 1)); + libxl_device_usb_init(usbs + *num); + usbs[*num].u.hostdev.hostbus = bus; + usbs[*num].u.hostdev.hostaddr = addr; + (*num)++; + } + + closedir(dir); + +out: + GC_FREE; + return usbs; +} + /* get usb devices under certain usb controller */ static int libxl__device_usb_list_per_usbctrl(libxl__gc *gc, uint32_t domid, -- 2.1.4