]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Allow passing a vroot into security manager hostdev labelling
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 27 Nov 2012 16:17:47 +0000 (16:17 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 17 Dec 2012 17:50:51 +0000 (17:50 +0000)
When LXC labels USB devices during hotplug, it is running in
host context, so it needs to pass in a vroot path to the
container root.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
13 files changed:
src/qemu/qemu_cgroup.c
src/qemu/qemu_hostdev.c
src/qemu/qemu_hotplug.c
src/security/security_apparmor.c
src/security/security_dac.c
src/security/security_driver.h
src/security/security_manager.c
src/security/security_manager.h
src/security/security_nop.c
src/security/security_selinux.c
src/security/security_stack.c
src/util/hostusb.c
src/util/hostusb.h

index 30cd1d6f74e6c240154d0fab0ee456b6ab013045..084d89d619dd12164dac273323ce4d3f873549f8 100644 (file)
@@ -290,7 +290,8 @@ int qemuSetupCgroup(virQEMUDriverPtr driver,
                 continue;
 
             if ((usb = usbGetDevice(hostdev->source.subsys.u.usb.bus,
-                                    hostdev->source.subsys.u.usb.device)) == NULL)
+                                    hostdev->source.subsys.u.usb.device,
+                                    NULL)) == NULL)
                 goto cleanup;
 
             if (usbDeviceFileIterate(usb, qemuSetupHostUsbDeviceCgroup,
index a748b8b3027a4fde0e37dc21753dee023106e954..57c5a711604e323f4c85bd7d016eae92d35440bc 100644 (file)
@@ -179,7 +179,8 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver,
             continue;
 
         usb = usbGetDevice(hostdev->source.subsys.u.usb.bus,
-                           hostdev->source.subsys.u.usb.device);
+                           hostdev->source.subsys.u.usb.device,
+                           NULL);
         if (!usb) {
             VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s",
                      hostdev->source.subsys.u.usb.bus,
@@ -653,6 +654,7 @@ qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev,
 
     if (vendor && bus) {
         rc = usbFindDevice(vendor, product, bus, device,
+                           NULL,
                            autoAddress ? false : mandatory,
                            usb);
         if (rc < 0) {
@@ -673,7 +675,7 @@ qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev,
     if (vendor) {
         usbDeviceList *devs;
 
-        rc = usbFindDeviceByVendor(vendor, product, mandatory, &devs);
+        rc = usbFindDeviceByVendor(vendor, product, NULL, mandatory, &devs);
         if (rc < 0)
             return -1;
 
@@ -713,7 +715,7 @@ qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev,
                      bus, device);
         }
     } else if (!vendor && bus) {
-        if (usbFindDeviceByBus(bus, device, mandatory, usb) < 0)
+        if (usbFindDeviceByBus(bus, device, NULL, mandatory, usb) < 0)
             return -1;
     }
 
@@ -934,7 +936,8 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver,
             continue;
 
         usb = usbGetDevice(hostdev->source.subsys.u.usb.bus,
-                           hostdev->source.subsys.u.usb.device);
+                           hostdev->source.subsys.u.usb.device,
+                           NULL);
 
         if (!usb) {
             VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s",
index e9a5e3570c1843326e14e91e9ba7d27097fd7d10..5aab00bfeba556ffcaf13e20b72233351689e69b 100644 (file)
@@ -1105,7 +1105,8 @@ int qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver,
         }
 
         if ((usb = usbGetDevice(hostdev->source.subsys.u.usb.bus,
-                                hostdev->source.subsys.u.usb.device)) == NULL)
+                                hostdev->source.subsys.u.usb.device,
+                                NULL)) == NULL)
             goto error;
 
         data.vm = vm;
@@ -1173,7 +1174,7 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver,
     }
 
     if (virSecurityManagerSetHostdevLabel(driver->securityManager,
-                                          vm->def, hostdev) < 0)
+                                          vm->def, hostdev, NULL) < 0)
         goto cleanup;
 
     switch (hostdev->source.subsys.type) {
@@ -1201,7 +1202,7 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver,
 
 error:
     if (virSecurityManagerRestoreHostdevLabel(driver->securityManager,
-                                              vm->def, hostdev) < 0)
+                                              vm->def, hostdev, NULL) < 0)
         VIR_WARN("Unable to restore host device labelling on hotplug fail");
 
 cleanup:
@@ -2394,7 +2395,7 @@ qemuDomainDetachHostUsbDevice(virQEMUDriverPtr driver,
     if (ret < 0)
         return -1;
 
-    usb = usbGetDevice(subsys->u.usb.bus, subsys->u.usb.device);
+    usb = usbGetDevice(subsys->u.usb.bus, subsys->u.usb.device, NULL);
     if (usb) {
         usbDeviceListDel(driver->activeUsbHostdevs, usb);
         usbFreeDevice(usb);
@@ -2445,7 +2446,7 @@ int qemuDomainDetachThisHostDevice(virQEMUDriverPtr driver,
 
     if (!ret) {
         if (virSecurityManagerRestoreHostdevLabel(driver->securityManager,
-                                                  vm->def, detach) < 0) {
+                                                  vm->def, detach, NULL) < 0) {
             VIR_WARN("Failed to restore host device labelling");
         }
         virDomainHostdevRemove(vm->def, idx);
index b0cdb65fbef1266020189d4ca350e6caa5835495..f57b81fe3475201ca66ec1c5c7262510a5751681 100644 (file)
@@ -742,8 +742,8 @@ AppArmorReserveSecurityLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
 static int
 AppArmorSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
                                 virDomainDefPtr def,
-                                virDomainHostdevDefPtr dev)
-
+                                virDomainHostdevDefPtr dev,
+                                const char *vroot)
 {
     struct SDPDOP *ptr;
     int ret = -1;
@@ -770,7 +770,8 @@ AppArmorSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
     switch (dev->source.subsys.type) {
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: {
         usbDevice *usb = usbGetDevice(dev->source.subsys.u.usb.bus,
-                                      dev->source.subsys.u.usb.device);
+                                      dev->source.subsys.u.usb.device,
+                                      vroot);
 
         if (!usb)
             goto done;
@@ -808,7 +809,8 @@ done:
 static int
 AppArmorRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr,
                                     virDomainDefPtr def,
-                                    virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED)
+                                    virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED,
+                                    const char *vroot ATTRIBUTE_UNUSED)
 
 {
     const virSecurityLabelDefPtr secdef =
index b07c1328f44f82dd2c221095b29e68f6b4a813cb..2861725cdb7637d79f4f75652a68890174f9885b 100644 (file)
@@ -474,7 +474,8 @@ virSecurityDACSetSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED,
 static int
 virSecurityDACSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
                                       virDomainDefPtr def,
-                                      virDomainHostdevDefPtr dev)
+                                      virDomainHostdevDefPtr dev,
+                                      const char *vroot)
 {
     void *params[] = {mgr, def};
     virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
@@ -494,7 +495,8 @@ virSecurityDACSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
             return 0;
 
         usb = usbGetDevice(dev->source.subsys.u.usb.bus,
-                           dev->source.subsys.u.usb.device);
+                           dev->source.subsys.u.usb.device,
+                           vroot);
         if (!usb)
             goto done;
 
@@ -550,8 +552,9 @@ virSecurityDACRestoreSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED,
 
 static int
 virSecurityDACRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr,
-                                           virDomainDefPtr def ATTRIBUTE_UNUSED,
-                                           virDomainHostdevDefPtr dev)
+                                          virDomainDefPtr def ATTRIBUTE_UNUSED,
+                                          virDomainHostdevDefPtr dev,
+                                          const char *vroot)
 
 {
     virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
@@ -571,7 +574,8 @@ virSecurityDACRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr,
             return 0;
 
         usb = usbGetDevice(dev->source.subsys.u.usb.bus,
-                           dev->source.subsys.u.usb.device);
+                           dev->source.subsys.u.usb.device,
+                           vroot);
         if (!usb)
             goto done;
 
@@ -728,7 +732,8 @@ virSecurityDACRestoreSecurityAllLabel(virSecurityManagerPtr mgr,
     for (i = 0 ; i < def->nhostdevs ; i++) {
         if (virSecurityDACRestoreSecurityHostdevLabel(mgr,
                                                       def,
-                                                      def->hostdevs[i]) < 0)
+                                                      def->hostdevs[i],
+                                                      NULL) < 0)
             rc = -1;
     }
     for (i = 0 ; i < def->ndisks ; i++) {
@@ -793,7 +798,8 @@ virSecurityDACSetSecurityAllLabel(virSecurityManagerPtr mgr,
     for (i = 0 ; i < def->nhostdevs ; i++) {
         if (virSecurityDACSetSecurityHostdevLabel(mgr,
                                                   def,
-                                                  def->hostdevs[i]) < 0)
+                                                  def->hostdevs[i],
+                                                  NULL) < 0)
             return -1;
     }
 
index ad5097b8ed4149197f0fbb3dc665728d669d9a84..6b775ab343cf51999e0a5b7e00c678b32b1a6211 100644 (file)
@@ -61,10 +61,12 @@ typedef int (*virSecurityDomainSetImageLabel) (virSecurityManagerPtr mgr,
                                                virDomainDiskDefPtr disk);
 typedef int (*virSecurityDomainRestoreHostdevLabel) (virSecurityManagerPtr mgr,
                                                      virDomainDefPtr def,
-                                                     virDomainHostdevDefPtr dev);
+                                                     virDomainHostdevDefPtr dev,
+                                                     const char *vroot);
 typedef int (*virSecurityDomainSetHostdevLabel) (virSecurityManagerPtr mgr,
                                                  virDomainDefPtr def,
-                                                 virDomainHostdevDefPtr dev);
+                                                 virDomainHostdevDefPtr dev,
+                                                 const char *vroot);
 typedef int (*virSecurityDomainSetSavedStateLabel) (virSecurityManagerPtr mgr,
                                                     virDomainDefPtr def,
                                                     const char *savefile);
index 690e4da6cb359a6d0998166d07b6843d700477f6..db9483763bab6e523c64ece4437efea723210f59 100644 (file)
@@ -275,10 +275,11 @@ int virSecurityManagerSetImageLabel(virSecurityManagerPtr mgr,
 
 int virSecurityManagerRestoreHostdevLabel(virSecurityManagerPtr mgr,
                                           virDomainDefPtr vm,
-                                          virDomainHostdevDefPtr dev)
+                                          virDomainHostdevDefPtr dev,
+                                          const char *vroot)
 {
     if (mgr->drv->domainRestoreSecurityHostdevLabel)
-        return mgr->drv->domainRestoreSecurityHostdevLabel(mgr, vm, dev);
+        return mgr->drv->domainRestoreSecurityHostdevLabel(mgr, vm, dev, vroot);
 
     virReportError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
     return -1;
@@ -286,10 +287,11 @@ int virSecurityManagerRestoreHostdevLabel(virSecurityManagerPtr mgr,
 
 int virSecurityManagerSetHostdevLabel(virSecurityManagerPtr mgr,
                                       virDomainDefPtr vm,
-                                      virDomainHostdevDefPtr dev)
+                                      virDomainHostdevDefPtr dev,
+                                      const char *vroot)
 {
     if (mgr->drv->domainSetSecurityHostdevLabel)
-        return mgr->drv->domainSetSecurityHostdevLabel(mgr, vm, dev);
+        return mgr->drv->domainSetSecurityHostdevLabel(mgr, vm, dev, vroot);
 
     virReportError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
     return -1;
index 2de4d30aa0a861c164f10eaab600f46b43076592..dc09c7cbb54aee030aac299f6403e59ae1103ac8 100644 (file)
@@ -71,10 +71,12 @@ int virSecurityManagerSetImageLabel(virSecurityManagerPtr mgr,
                                     virDomainDiskDefPtr disk);
 int virSecurityManagerRestoreHostdevLabel(virSecurityManagerPtr mgr,
                                           virDomainDefPtr def,
-                                          virDomainHostdevDefPtr dev);
+                                          virDomainHostdevDefPtr dev,
+                                          const char *vroot);
 int virSecurityManagerSetHostdevLabel(virSecurityManagerPtr mgr,
                                       virDomainDefPtr def,
-                                      virDomainHostdevDefPtr dev);
+                                      virDomainHostdevDefPtr dev,
+                                      const char *vroot);
 int virSecurityManagerSetSavedStateLabel(virSecurityManagerPtr mgr,
                                          virDomainDefPtr def,
                                          const char *savefile);
index 5f3270a32dc6aadebd8fe6a77c1461c1e3d7c3f7..7bc8bba8c30fe6771fb0bee8a6ccfbec56f26818 100644 (file)
@@ -84,14 +84,16 @@ static int virSecurityDomainSetImageLabelNop(virSecurityManagerPtr mgr ATTRIBUTE
 
 static int virSecurityDomainRestoreHostdevLabelNop(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
                                                    virDomainDefPtr vm ATTRIBUTE_UNUSED,
-                                                   virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED)
+                                                   virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED,
+                                                   const char *vroot ATTRIBUTE_UNUSED)
 {
     return 0;
 }
 
 static int virSecurityDomainSetHostdevLabelNop(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
                                                virDomainDefPtr vm ATTRIBUTE_UNUSED,
-                                               virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED)
+                                               virDomainHostdevDefPtr dev ATTRIBUTE_UNUSED,
+                                               const char *vroot ATTRIBUTE_UNUSED)
 {
     return 0;
 }
index 13ef3a58cca8a53d091b02922e97758680329068..1b33067e38a6d7f7455155722cd5769f81c61c7b 100644 (file)
@@ -1161,7 +1161,8 @@ virSecuritySELinuxSetSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED,
 static int
 virSecuritySELinuxSetSecurityHostdevLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
                                           virDomainDefPtr def,
-                                          virDomainHostdevDefPtr dev)
+                                          virDomainHostdevDefPtr dev,
+                                          const char *vroot)
 
 {
     virSecurityLabelDefPtr secdef;
@@ -1185,7 +1186,8 @@ virSecuritySELinuxSetSecurityHostdevLabel(virSecurityManagerPtr mgr ATTRIBUTE_UN
             return 0;
 
         usb = usbGetDevice(dev->source.subsys.u.usb.bus,
-                           dev->source.subsys.u.usb.device);
+                           dev->source.subsys.u.usb.device,
+                           vroot);
         if (!usb)
             goto done;
 
@@ -1238,7 +1240,8 @@ virSecuritySELinuxRestoreSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED,
 static int
 virSecuritySELinuxRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
                                               virDomainDefPtr def,
-                                              virDomainHostdevDefPtr dev)
+                                              virDomainHostdevDefPtr dev,
+                                              const char *vroot)
 
 {
     virSecurityLabelDefPtr secdef;
@@ -1262,7 +1265,8 @@ virSecuritySELinuxRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr ATTRIBUT
             return 0;
 
         usb = usbGetDevice(dev->source.subsys.u.usb.bus,
-                           dev->source.subsys.u.usb.device);
+                           dev->source.subsys.u.usb.device,
+                           vroot);
         if (!usb)
             goto done;
 
@@ -1504,7 +1508,8 @@ virSecuritySELinuxRestoreSecurityAllLabel(virSecurityManagerPtr mgr,
     for (i = 0 ; i < def->nhostdevs ; i++) {
         if (virSecuritySELinuxRestoreSecurityHostdevLabel(mgr,
                                                           def,
-                                                          def->hostdevs[i]) < 0)
+                                                          def->hostdevs[i],
+                                                          NULL) < 0)
             rc = -1;
     }
     for (i = 0 ; i < def->ndisks ; i++) {
@@ -1874,8 +1879,9 @@ virSecuritySELinuxSetSecurityAllLabel(virSecurityManagerPtr mgr,
 
     for (i = 0 ; i < def->nhostdevs ; i++) {
         if (virSecuritySELinuxSetSecurityHostdevLabel(mgr,
-                                           def,
-                                           def->hostdevs[i]) < 0)
+                                                      def,
+                                                      def->hostdevs[i],
+                                                      NULL) < 0)
             return -1;
     }
 
index c2ccbd0df0fe72e79b6058f38d2ff460ff7d3a4f..65d42406a60c4214f880812ceabf4beddeac81dd 100644 (file)
@@ -236,7 +236,8 @@ virSecurityStackRestoreSecurityImageLabel(virSecurityManagerPtr mgr,
 static int
 virSecurityStackSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
                                         virDomainDefPtr vm,
-                                        virDomainHostdevDefPtr dev)
+                                        virDomainHostdevDefPtr dev,
+                                        const char *vroot)
 
 {
     virSecurityStackDataPtr priv = virSecurityManagerGetPrivateData(mgr);
@@ -244,7 +245,10 @@ virSecurityStackSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
     int rc = 0;
 
     for (; item; item = item->next) {
-        if (virSecurityManagerSetHostdevLabel(item->securityManager, vm, dev) < 0)
+        if (virSecurityManagerSetHostdevLabel(item->securityManager,
+                                              vm,
+                                              dev,
+                                              vroot) < 0)
             rc = -1;
     }
 
@@ -255,14 +259,18 @@ virSecurityStackSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
 static int
 virSecurityStackRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr,
                                             virDomainDefPtr vm,
-                                            virDomainHostdevDefPtr dev)
+                                            virDomainHostdevDefPtr dev,
+                                            const char *vroot)
 {
     virSecurityStackDataPtr priv = virSecurityManagerGetPrivateData(mgr);
     virSecurityStackItemPtr item = priv->itemsHead;
     int rc = 0;
 
     for (; item; item = item->next) {
-        if (virSecurityManagerRestoreHostdevLabel(item->securityManager, vm, dev) < 0)
+        if (virSecurityManagerRestoreHostdevLabel(item->securityManager,
+                                                  vm,
+                                                  dev,
+                                                  vroot) < 0)
             rc = -1;
     }
 
index 81a9f5ab55645b19dcf0524015b27e275645bf2b..24f925b377155f4a34c1db9e129ea1f1048630d1 100644 (file)
@@ -101,6 +101,7 @@ usbDeviceSearch(unsigned int vendor,
                 unsigned int product,
                 unsigned int bus,
                 unsigned int devno,
+                const char *vroot,
                 unsigned int flags)
 {
     DIR *dir = NULL;
@@ -160,7 +161,7 @@ usbDeviceSearch(unsigned int vendor,
             found = true;
         }
 
-        usb = usbGetDevice(found_bus, found_devno);
+        usb = usbGetDevice(found_bus, found_devno, vroot);
         if (!usb)
             goto cleanup;
 
@@ -189,6 +190,7 @@ cleanup:
 int
 usbFindDeviceByVendor(unsigned int vendor,
                       unsigned product,
+                      const char *vroot,
                       bool mandatory,
                       usbDeviceList **devices)
 {
@@ -196,6 +198,7 @@ usbFindDeviceByVendor(unsigned int vendor,
     int count;
 
     if (!(list = usbDeviceSearch(vendor, product, 0 , 0,
+                                 vroot,
                                  USB_DEVICE_FIND_BY_VENDOR)))
         return -1;
 
@@ -226,12 +229,14 @@ usbFindDeviceByVendor(unsigned int vendor,
 int
 usbFindDeviceByBus(unsigned int bus,
                    unsigned devno,
+                   const char *vroot,
                    bool mandatory,
                    usbDevice **usb)
 {
     usbDeviceList *list;
 
     if (!(list = usbDeviceSearch(0, 0, bus, devno,
+                                 vroot,
                                  USB_DEVICE_FIND_BY_BUS)))
         return -1;
 
@@ -265,13 +270,15 @@ usbFindDevice(unsigned int vendor,
               unsigned int product,
               unsigned int bus,
               unsigned int devno,
+              const char *vroot,
               bool mandatory,
               usbDevice **usb)
 {
     usbDeviceList *list;
 
     unsigned int flags = USB_DEVICE_FIND_BY_VENDOR|USB_DEVICE_FIND_BY_BUS;
-    if (!(list = usbDeviceSearch(vendor, product, bus, devno, flags)))
+    if (!(list = usbDeviceSearch(vendor, product, bus, devno,
+                                 vroot, flags)))
         return -1;
 
     if (list->count == 0) {
@@ -301,7 +308,8 @@ usbFindDevice(unsigned int vendor,
 
 usbDevice *
 usbGetDevice(unsigned int bus,
-             unsigned int devno)
+             unsigned int devno,
+             const char *vroot)
 {
     usbDevice *dev;
 
@@ -321,7 +329,8 @@ usbGetDevice(unsigned int bus,
         usbFreeDevice(dev);
         return NULL;
     }
-    if (virAsprintf(&dev->path, USB_DEVFS "%03d/%03d",
+    if (virAsprintf(&dev->path, "%s" USB_DEVFS "%03d/%03d",
+                    vroot ? vroot : "",
                     dev->bus, dev->dev) < 0) {
         virReportOOMError();
         usbFreeDevice(dev);
index 4f55fdc5bf49c5f2733a8a4963810bbad5590fbc..aee15268eac2fa3ff3eb7196ae95674c3c91c335 100644 (file)
@@ -29,15 +29,18 @@ typedef struct _usbDevice usbDevice;
 typedef struct _usbDeviceList usbDeviceList;
 
 usbDevice *usbGetDevice(unsigned int bus,
-                        unsigned int devno);
+                        unsigned int devno,
+                        const char *vroot);
 
 int usbFindDeviceByBus(unsigned int bus,
                        unsigned int devno,
+                       const char *vroot,
                        bool mandatory,
                        usbDevice **usb);
 
 int usbFindDeviceByVendor(unsigned int vendor,
                           unsigned int product,
+                          const char *vroot,
                           bool mandatory,
                           usbDeviceList **devices);
 
@@ -45,6 +48,7 @@ int usbFindDevice(unsigned int vendor,
                   unsigned int product,
                   unsigned int bus,
                   unsigned int devno,
+                  const char *vroot,
                   bool mandatory,
                   usbDevice **usb);