[libvirt] [PATCH 46/66] vbox: Rewrite vboxDomainUpdateDeviceFlags

Taowei uaedante at gmail.com
Mon Aug 11 10:06:49 UTC 2014


Since vboxDomainAttachDeviceImple not used in vbox_tmpl.c, it has
been deleted.
---
 src/vbox/vbox_common.c        |   16 +++
 src/vbox/vbox_tmpl.c          |  215 -----------------------------------------
 src/vbox/vbox_uniformed_api.h |    2 +
 3 files changed, 18 insertions(+), 215 deletions(-)

diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index f22cb5b..71c97a0 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -4169,3 +4169,19 @@ int vboxDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
 
     return vboxDomainAttachDeviceImpl(dom, xml, 0);
 }
+
+int vboxDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
+                                unsigned int flags)
+{
+    virCheckFlags(VIR_DOMAIN_AFFECT_CURRENT |
+                  VIR_DOMAIN_AFFECT_LIVE |
+                  VIR_DOMAIN_AFFECT_CONFIG, -1);
+
+    if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("cannot modify the persistent configuration of a domain"));
+        return -1;
+    }
+
+    return vboxDomainAttachDeviceImpl(dom, xml, 1);
+}
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 5078f27..dd93e2a 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -1450,221 +1450,6 @@ _vboxAttachDrivesOld(virDomainDefPtr def ATTRIBUTE_UNUSED,
 
 #endif /* VBOX_API_VERSION >= 4000000 */
 
-static int vboxDomainAttachDeviceImpl(virDomainPtr dom,
-                                      const char *xml,
-                                      int mediaChangeOnly ATTRIBUTE_UNUSED)
-{
-    VBOX_OBJECT_CHECK(dom->conn, int, -1);
-    IMachine *machine    = NULL;
-    vboxIID iid = VBOX_IID_INITIALIZER;
-    PRUint32 state       = MachineState_Null;
-    virDomainDefPtr def  = NULL;
-    virDomainDeviceDefPtr dev  = NULL;
-    nsresult rc;
-
-    if (VIR_ALLOC(def) < 0)
-        return ret;
-
-    if (VIR_STRDUP(def->os.type, "hvm") < 0)
-        goto cleanup;
-
-    dev = virDomainDeviceDefParse(xml, def, data->caps, data->xmlopt,
-                                  VIR_DOMAIN_XML_INACTIVE);
-    if (dev == NULL)
-        goto cleanup;
-
-    vboxIIDFromUUID(&iid, dom->uuid);
-    rc = VBOX_OBJECT_GET_MACHINE(iid.value, &machine);
-    if (NS_FAILED(rc)) {
-        virReportError(VIR_ERR_NO_DOMAIN, "%s",
-                       _("no domain with matching uuid"));
-        goto cleanup;
-    }
-
-    if (machine) {
-        machine->vtbl->GetState(machine, &state);
-
-        if ((state == MachineState_Running) ||
-            (state == MachineState_Paused)) {
-            rc = VBOX_SESSION_OPEN_EXISTING(iid.value, machine);
-        } else {
-            rc = VBOX_SESSION_OPEN(iid.value, machine);
-        }
-        if (NS_SUCCEEDED(rc)) {
-            rc = data->vboxSession->vtbl->GetMachine(data->vboxSession, &machine);
-            if (NS_SUCCEEDED(rc) && machine) {
-                if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
-#if VBOX_API_VERSION < 3001000
-                    const char *src = virDomainDiskGetSource(dev->data.disk);
-                    int type = virDomainDiskGetType(dev->data.disk);
-
-                    if (dev->data.disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) {
-                        if (type == VIR_STORAGE_TYPE_FILE && src) {
-                            IDVDDrive *dvdDrive = NULL;
-                            /* Currently CDROM/DVD Drive is always IDE
-                             * Secondary Master so neglecting the following
-                             * parameter dev->data.disk->bus
-                             */
-                            machine->vtbl->GetDVDDrive(machine, &dvdDrive);
-                            if (dvdDrive) {
-                                IDVDImage *dvdImage          = NULL;
-                                PRUnichar *dvdfileUtf16      = NULL;
-                                vboxIID dvduuid = VBOX_IID_INITIALIZER;
-                                vboxIID dvdemptyuuid = VBOX_IID_INITIALIZER;
-
-                                VBOX_UTF8_TO_UTF16(src, &dvdfileUtf16);
-
-                                data->vboxObj->vtbl->FindDVDImage(data->vboxObj, dvdfileUtf16, &dvdImage);
-                                if (!dvdImage) {
-                                    data->vboxObj->vtbl->OpenDVDImage(data->vboxObj, dvdfileUtf16, dvdemptyuuid.value, &dvdImage);
-                                }
-                                if (dvdImage) {
-                                    rc = dvdImage->vtbl->imedium.GetId((IMedium *)dvdImage, &dvduuid.value);
-                                    if (NS_FAILED(rc)) {
-                                        virReportError(VIR_ERR_INTERNAL_ERROR,
-                                                       _("can't get the uuid of the file to "
-                                                         "be attached to cdrom: %s, rc=%08x"),
-                                                       src, (unsigned)rc);
-                                    } else {
-                                        /* unmount the previous mounted image */
-                                        dvdDrive->vtbl->Unmount(dvdDrive);
-                                        rc = dvdDrive->vtbl->MountImage(dvdDrive, dvduuid.value);
-                                        if (NS_FAILED(rc)) {
-                                            virReportError(VIR_ERR_INTERNAL_ERROR,
-                                                           _("could not attach the file to cdrom: %s, rc=%08x"),
-                                                           src, (unsigned)rc);
-                                        } else {
-                                            ret = 0;
-                                            DEBUGIID("CD/DVD Image UUID:", dvduuid.value);
-                                        }
-                                    }
-
-                                    VBOX_MEDIUM_RELEASE(dvdImage);
-                                }
-                                vboxIIDUnalloc(&dvduuid);
-                                VBOX_UTF16_FREE(dvdfileUtf16);
-                                VBOX_RELEASE(dvdDrive);
-                            }
-                        } else if (type == VIR_STORAGE_TYPE_BLOCK) {
-                        }
-                    } else if (dev->data.disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
-                        if (type == VIR_STORAGE_TYPE_FILE && src) {
-                            IFloppyDrive *floppyDrive;
-                            machine->vtbl->GetFloppyDrive(machine, &floppyDrive);
-                            if (floppyDrive) {
-                                rc = floppyDrive->vtbl->SetEnabled(floppyDrive, 1);
-                                if (NS_SUCCEEDED(rc)) {
-                                    IFloppyImage *floppyImage   = NULL;
-                                    PRUnichar *fdfileUtf16      = NULL;
-                                    vboxIID fduuid = VBOX_IID_INITIALIZER;
-                                    vboxIID fdemptyuuid = VBOX_IID_INITIALIZER;
-                                    VBOX_UTF8_TO_UTF16(src, &fdfileUtf16);
-                                    rc = data->vboxObj->vtbl->FindFloppyImage(data->vboxObj,
-                                                                              fdfileUtf16,
-                                                                              &floppyImage);
-
-                                    if (!floppyImage) {
-                                        data->vboxObj->vtbl->OpenFloppyImage(data->vboxObj,
-                                                                             fdfileUtf16,
-                                                                             fdemptyuuid.value,
-                                                                             &floppyImage);
-                                    }
-
-                                    if (floppyImage) {
-                                        rc = floppyImage->vtbl->imedium.GetId((IMedium *)floppyImage, &fduuid.value);
-                                        if (NS_FAILED(rc)) {
-                                            virReportError(VIR_ERR_INTERNAL_ERROR,
-                                                           _("can't get the uuid of the file to be "
-                                                             "attached to floppy drive: %s, rc=%08x"),
-                                                           src, (unsigned)rc);
-                                        } else {
-                                            rc = floppyDrive->vtbl->MountImage(floppyDrive, fduuid.value);
-                                            if (NS_FAILED(rc)) {
-                                                virReportError(VIR_ERR_INTERNAL_ERROR,
-                                                               _("could not attach the file to floppy drive: %s, rc=%08x"),
-                                                               src, (unsigned)rc);
-                                            } else {
-                                                ret = 0;
-                                                DEBUGIID("attached floppy, UUID:", fduuid.value);
-                                            }
-                                        }
-                                        VBOX_MEDIUM_RELEASE(floppyImage);
-                                    }
-                                    vboxIIDUnalloc(&fduuid);
-                                    VBOX_UTF16_FREE(fdfileUtf16);
-                                }
-                                VBOX_RELEASE(floppyDrive);
-                            }
-                        } else if (type == VIR_STORAGE_TYPE_BLOCK) {
-                        }
-                    }
-#else  /* VBOX_API_VERSION >= 3001000 */
-#endif /* VBOX_API_VERSION >= 3001000 */
-                } else if (dev->type == VIR_DOMAIN_DEVICE_NET) {
-                } else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
-                    if (dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
-                        if (dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
-                        }
-                    }
-                } else if (dev->type == VIR_DOMAIN_DEVICE_FS &&
-                           dev->data.fs->type == VIR_DOMAIN_FS_TYPE_MOUNT) {
-                    PRUnichar *nameUtf16;
-                    PRUnichar *hostPathUtf16;
-                    PRBool writable;
-
-                    VBOX_UTF8_TO_UTF16(dev->data.fs->dst, &nameUtf16);
-                    VBOX_UTF8_TO_UTF16(dev->data.fs->src, &hostPathUtf16);
-                    writable = !dev->data.fs->readonly;
-
-#if VBOX_API_VERSION < 4000000
-                    rc = machine->vtbl->CreateSharedFolder(machine, nameUtf16, hostPathUtf16,
-                                                           writable);
-#else /* VBOX_API_VERSION >= 4000000 */
-                    rc = machine->vtbl->CreateSharedFolder(machine, nameUtf16, hostPathUtf16,
-                                                           writable, PR_FALSE);
-#endif /* VBOX_API_VERSION >= 4000000 */
-
-                    if (NS_FAILED(rc)) {
-                        virReportError(VIR_ERR_INTERNAL_ERROR,
-                                       _("could not attach shared folder '%s', rc=%08x"),
-                                       dev->data.fs->dst, (unsigned)rc);
-                    } else {
-                        ret = 0;
-                    }
-
-                    VBOX_UTF16_FREE(nameUtf16);
-                    VBOX_UTF16_FREE(hostPathUtf16);
-                }
-                machine->vtbl->SaveSettings(machine);
-                VBOX_RELEASE(machine);
-            }
-            VBOX_SESSION_CLOSE();
-        }
-    }
-
- cleanup:
-    vboxIIDUnalloc(&iid);
-    virDomainDefFree(def);
-    virDomainDeviceDefFree(dev);
-    return ret;
-}
-
-static int vboxDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
-                                       unsigned int flags)
-{
-    virCheckFlags(VIR_DOMAIN_AFFECT_CURRENT |
-                  VIR_DOMAIN_AFFECT_LIVE |
-                  VIR_DOMAIN_AFFECT_CONFIG, -1);
-
-    if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
-        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
-                       _("cannot modify the persistent configuration of a domain"));
-        return -1;
-    }
-
-    return vboxDomainAttachDeviceImpl(dom, xml, 1);
-}
-
 static int vboxDomainDetachDevice(virDomainPtr dom, const char *xml)
 {
     VBOX_OBJECT_CHECK(dom->conn, int, -1);
diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h
index 69090f3..493d12c 100644
--- a/src/vbox/vbox_uniformed_api.h
+++ b/src/vbox/vbox_uniformed_api.h
@@ -527,6 +527,8 @@ int vboxConnectNumOfDefinedDomains(virConnectPtr conn);
 int vboxDomainAttachDevice(virDomainPtr dom, const char *xml);
 int vboxDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
                                 unsigned int flags);
+int vboxDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
+                                unsigned int flags);
 
 /* Version specified functions for installing uniformed API */
 void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);
-- 
1.7.9.5




More information about the libvir-list mailing list