* src/vbox/vbox_tmpl.c (vboxDomainDefineXML): Split... (vboxSetBootDeviceOrder, vboxAttachDrives, vboxAttachSound) (vboxAttachNetwork, vboxAttachSerial, vboxAttachParallel) (vboxAttachVideo, vboxAttachDisplay, vboxAttachUSB): ...into new helper functions. --- Should be no functional changes - just breaking up a HUGE function into more manageable chunks with less indentation. In reviewing this, it may help to apply the patch and use 'git diff -b'. src/vbox/vbox_tmpl.c | 2083 ++++++++++++++++++++++++++------------------------ 1 files changed, 1082 insertions(+), 1001 deletions(-) diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 3c07509..3e8ff23 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -3379,1186 +3379,1267 @@ static int vboxDomainCreate(virDomainPtr dom) { return vboxDomainCreateWithFlags(dom, 0); } -static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) { - VBOX_OBJECT_CHECK(conn, virDomainPtr, NULL); - IMachine *machine = NULL; - IBIOSSettings *bios = NULL; - vboxIID *iid = NULL; - vboxIID *mchiid = NULL; - virDomainDefPtr def = NULL; - PRUnichar *machineNameUtf16 = NULL; -#if VBOX_API_VERSION >= 3002 - PRBool override = PR_FALSE; -#endif - nsresult rc; - - if (!(def = virDomainDefParseString(data->caps, xml, - VIR_DOMAIN_XML_INACTIVE))) { - goto cleanup; - } - -#if VBOX_API_VERSION == 2002 - if (VIR_ALLOC(iid) < 0) { - virReportOOMError(); - goto cleanup; - } -#endif +static void +vboxSetBootDeviceOrder(virDomainDefPtr def, vboxGlobalData *data, + IMachine *machine) +{ + ISystemProperties *systemProperties = NULL; + PRUint32 maxBootPosition = 0; + int i = 0; - VBOX_UTF8_TO_UTF16(def->name, &machineNameUtf16); - vboxIIDFromUUID(def->uuid, iid); -#if VBOX_API_VERSION < 3002 - rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj, - machineNameUtf16, - NULL, - NULL, - iid, - &machine); -#else /* VBOX_API_VERSION >= 3002 */ - rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj, - machineNameUtf16, - NULL, - NULL, - iid, - override, - &machine); -#endif /* VBOX_API_VERSION >= 3002 */ - VBOX_UTF16_FREE(machineNameUtf16); + DEBUG("def->os.type %s", def->os.type); + DEBUG("def->os.arch %s", def->os.arch); + DEBUG("def->os.machine %s", def->os.machine); + DEBUG("def->os.nBootDevs %d", def->os.nBootDevs); + DEBUG("def->os.bootDevs[0] %d", def->os.bootDevs[0]); + DEBUG("def->os.bootDevs[1] %d", def->os.bootDevs[1]); + DEBUG("def->os.bootDevs[2] %d", def->os.bootDevs[2]); + DEBUG("def->os.bootDevs[3] %d", def->os.bootDevs[3]); + DEBUG("def->os.init %s", def->os.init); + DEBUG("def->os.kernel %s", def->os.kernel); + DEBUG("def->os.initrd %s", def->os.initrd); + DEBUG("def->os.cmdline %s", def->os.cmdline); + DEBUG("def->os.root %s", def->os.root); + DEBUG("def->os.loader %s", def->os.loader); + DEBUG("def->os.bootloader %s", def->os.bootloader); + DEBUG("def->os.bootloaderArgs %s", def->os.bootloaderArgs); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not define a domain, rc=%08x"), (unsigned)rc); - goto cleanup; + data->vboxObj->vtbl->GetSystemProperties(data->vboxObj, &systemProperties); + if (systemProperties) { + systemProperties->vtbl->GetMaxBootPosition(systemProperties, + &maxBootPosition); + VBOX_RELEASE(systemProperties); + systemProperties = NULL; } - rc = machine->vtbl->SetMemorySize(machine, def->memory / 1024); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not set the memory size of the domain to: %lu Kb, " - "rc=%08x"), - def->memory, (unsigned)rc); + /* Clear the defaults first */ + for (i = 0; i < maxBootPosition; i++) { + machine->vtbl->SetBootOrder(machine, i+1, DeviceType_Null); } - rc = machine->vtbl->SetCPUCount(machine, def->vcpus); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not set the number of virtual CPUs to: %lu, rc=%08x"), - def->vcpus, (unsigned)rc); - } + for (i = 0; (i < def->os.nBootDevs) && (i < maxBootPosition); i++) { + PRUint32 device = DeviceType_Null; -#if VBOX_API_VERSION < 3001 - rc = machine->vtbl->SetPAEEnabled(machine, (def->features) & - (1 << VIR_DOMAIN_FEATURE_PAE)); -#elif VBOX_API_VERSION == 3001 - rc = machine->vtbl->SetCpuProperty(machine, CpuPropertyType_PAE, - (def->features) & - (1 << VIR_DOMAIN_FEATURE_PAE)); -#elif VBOX_API_VERSION >= 3002 - rc = machine->vtbl->SetCPUProperty(machine, CPUPropertyType_PAE, - (def->features) & - (1 << VIR_DOMAIN_FEATURE_PAE)); -#endif - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not change PAE status to: %s, rc=%08x"), - ((def->features) & (1 << VIR_DOMAIN_FEATURE_PAE)) - ? _("Enabled") : _("Disabled"), (unsigned)rc); - } - - machine->vtbl->GetBIOSSettings(machine, &bios); - if (bios) { - rc = bios->vtbl->SetACPIEnabled(bios, (def->features) & - (1 << VIR_DOMAIN_FEATURE_ACPI)); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not change ACPI status to: %s, rc=%08x"), - ((def->features) & (1 << VIR_DOMAIN_FEATURE_ACPI)) - ? _("Enabled") : _("Disabled"), (unsigned)rc); - } - rc = bios->vtbl->SetIOAPICEnabled(bios, (def->features) & - (1 << VIR_DOMAIN_FEATURE_APIC)); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not change APIC status to: %s, rc=%08x"), - ((def->features) & (1 << VIR_DOMAIN_FEATURE_APIC)) - ? _("Enabled") : _("Disabled"), (unsigned)rc); + if (def->os.bootDevs[i] == VIR_DOMAIN_BOOT_FLOPPY) { + device = DeviceType_Floppy; + } else if (def->os.bootDevs[i] == VIR_DOMAIN_BOOT_CDROM) { + device = DeviceType_DVD; + } else if (def->os.bootDevs[i] == VIR_DOMAIN_BOOT_DISK) { + device = DeviceType_HardDisk; + } else if (def->os.bootDevs[i] == VIR_DOMAIN_BOOT_NET) { + device = DeviceType_Network; } - VBOX_RELEASE(bios); - } - - /* Register the machine before attaching other devices to it */ - rc = data->vboxObj->vtbl->RegisterMachine(data->vboxObj, machine); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not define a domain, rc=%08x"), (unsigned)rc); - goto cleanup; + machine->vtbl->SetBootOrder(machine, i+1, device); } +} - /* Get the uuid of the machine, currently it is immutable - * object so open a session to it and get it back, so that - * you can make changes to the machine setting - */ - machine->vtbl->GetId(machine, &mchiid); - data->vboxObj->vtbl->OpenSession(data->vboxObj, data->vboxSession, mchiid); - data->vboxSession->vtbl->GetMachine(data->vboxSession, &machine); - - { /* Started:Block to set the boot device order */ - ISystemProperties *systemProperties = NULL; - PRUint32 maxBootPosition = 0; - int i = 0; - - DEBUG("def->os.type %s", def->os.type); - DEBUG("def->os.arch %s", def->os.arch); - DEBUG("def->os.machine %s", def->os.machine); - DEBUG("def->os.nBootDevs %d", def->os.nBootDevs); - DEBUG("def->os.bootDevs[0] %d", def->os.bootDevs[0]); - DEBUG("def->os.bootDevs[1] %d", def->os.bootDevs[1]); - DEBUG("def->os.bootDevs[2] %d", def->os.bootDevs[2]); - DEBUG("def->os.bootDevs[3] %d", def->os.bootDevs[3]); - DEBUG("def->os.init %s", def->os.init); - DEBUG("def->os.kernel %s", def->os.kernel); - DEBUG("def->os.initrd %s", def->os.initrd); - DEBUG("def->os.cmdline %s", def->os.cmdline); - DEBUG("def->os.root %s", def->os.root); - DEBUG("def->os.loader %s", def->os.loader); - DEBUG("def->os.bootloader %s", def->os.bootloader); - DEBUG("def->os.bootloaderArgs %s", def->os.bootloaderArgs); - - data->vboxObj->vtbl->GetSystemProperties(data->vboxObj, &systemProperties); - if (systemProperties) { - systemProperties->vtbl->GetMaxBootPosition(systemProperties, &maxBootPosition); - VBOX_RELEASE(systemProperties); - systemProperties = NULL; - } - - /* Clear the defaults first */ - for (i = 0; i < maxBootPosition; i++) { - machine->vtbl->SetBootOrder(machine, i+1, DeviceType_Null); - } - - for (i = 0; (i < def->os.nBootDevs) && (i < maxBootPosition); i++) { - PRUint32 device = DeviceType_Null; - - if (def->os.bootDevs[i] == VIR_DOMAIN_BOOT_FLOPPY) { - device = DeviceType_Floppy; - } else if (def->os.bootDevs[i] == VIR_DOMAIN_BOOT_CDROM) { - device = DeviceType_DVD; - } else if (def->os.bootDevs[i] == VIR_DOMAIN_BOOT_DISK) { - device = DeviceType_HardDisk; - } else if (def->os.bootDevs[i] == VIR_DOMAIN_BOOT_NET) { - device = DeviceType_Network; - } - machine->vtbl->SetBootOrder(machine, i+1, device); - } - } /* Finished:Block to set the boot device order */ +static void +vboxAttachDrives(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine) +{ + int i; + nsresult rc; #if VBOX_API_VERSION < 3001 - { /* Started:Block to attach the CDROM/DVD Drive and HardDisks to the VM */ - - if (def->ndisks > 0) { - int i; - - for (i = 0; i < def->ndisks; i++) { - DEBUG("disk(%d) type: %d", i, def->disks[i]->type); - DEBUG("disk(%d) device: %d", i, def->disks[i]->device); - DEBUG("disk(%d) bus: %d", i, def->disks[i]->bus); - DEBUG("disk(%d) src: %s", i, def->disks[i]->src); - DEBUG("disk(%d) dst: %s", i, def->disks[i]->dst); - DEBUG("disk(%d) driverName: %s", i, def->disks[i]->driverName); - DEBUG("disk(%d) driverType: %s", i, def->disks[i]->driverType); - DEBUG("disk(%d) cachemode: %d", i, def->disks[i]->cachemode); - DEBUG("disk(%d) readonly: %s", i, def->disks[i]->readonly ? "True" : "False"); - DEBUG("disk(%d) shared: %s", i, def->disks[i]->shared ? "True" : "False"); - - if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM) { - if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_FILE && - def->disks[i]->src != NULL) { - IDVDDrive *dvdDrive = NULL; - /* Currently CDROM/DVD Drive is always IDE - * Secondary Master so neglecting the following - * parameters: - * def->disks[i]->bus - * def->disks[i]->dst - */ + if (def->ndisks == 0) + return; - machine->vtbl->GetDVDDrive(machine, &dvdDrive); - if (dvdDrive) { - IDVDImage *dvdImage = NULL; - PRUnichar *dvdfileUtf16 = NULL; - vboxIID *dvduuid = NULL; + for (i = 0; i < def->ndisks; i++) { + DEBUG("disk(%d) type: %d", i, def->disks[i]->type); + DEBUG("disk(%d) device: %d", i, def->disks[i]->device); + DEBUG("disk(%d) bus: %d", i, def->disks[i]->bus); + DEBUG("disk(%d) src: %s", i, def->disks[i]->src); + DEBUG("disk(%d) dst: %s", i, def->disks[i]->dst); + DEBUG("disk(%d) driverName: %s", i, def->disks[i]->driverName); + DEBUG("disk(%d) driverType: %s", i, def->disks[i]->driverType); + DEBUG("disk(%d) cachemode: %d", i, def->disks[i]->cachemode); + DEBUG("disk(%d) readonly: %s", i, (def->disks[i]->readonly + ? "True" : "False")); + DEBUG("disk(%d) shared: %s", i, (def->disks[i]->shared + ? "True" : "False")); + + if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM) { + if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_FILE && + def->disks[i]->src != NULL) { + IDVDDrive *dvdDrive = NULL; + /* Currently CDROM/DVD Drive is always IDE + * Secondary Master so neglecting the following + * parameters: + * def->disks[i]->bus + * def->disks[i]->dst + */ + + machine->vtbl->GetDVDDrive(machine, &dvdDrive); + if (dvdDrive) { + IDVDImage *dvdImage = NULL; + PRUnichar *dvdfileUtf16 = NULL; + vboxIID *dvduuid = NULL; # if VBOX_API_VERSION == 2002 - nsID dvdemptyuuid; + nsID dvdemptyuuid; - memset(&dvdemptyuuid, 0, sizeof(dvdemptyuuid)); + memset(&dvdemptyuuid, 0, sizeof(dvdemptyuuid)); # else - PRUnichar *dvdemptyuuidUtf16 = NULL; + PRUnichar *dvdemptyuuidUtf16 = NULL; # endif - VBOX_UTF8_TO_UTF16(def->disks[i]->src, &dvdfileUtf16); + VBOX_UTF8_TO_UTF16(def->disks[i]->src, &dvdfileUtf16); - data->vboxObj->vtbl->FindDVDImage(data->vboxObj, dvdfileUtf16, &dvdImage); - if (!dvdImage) { + data->vboxObj->vtbl->FindDVDImage(data->vboxObj, + dvdfileUtf16, &dvdImage); + if (!dvdImage) { # if VBOX_API_VERSION == 2002 - data->vboxObj->vtbl->OpenDVDImage(data->vboxObj, dvdfileUtf16, &dvdemptyuuid, &dvdImage); + data->vboxObj->vtbl->OpenDVDImage(data->vboxObj, + dvdfileUtf16, + &dvdemptyuuid, + &dvdImage); # else - data->vboxObj->vtbl->OpenDVDImage(data->vboxObj, dvdfileUtf16, dvdemptyuuidUtf16, &dvdImage); + data->vboxObj->vtbl->OpenDVDImage(data->vboxObj, + dvdfileUtf16, + dvdemptyuuidUtf16, + &dvdImage); # endif + } + if (dvdImage) { + rc = dvdImage->vtbl->imedium.GetId((IMedium *)dvdImage, + &dvduuid); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("can't get the uuid of the file to " + "be attached to cdrom: %s, rc=%08x"), + def->disks[i]->src, (unsigned)rc); + } else { + rc = dvdDrive->vtbl->MountImage(dvdDrive, dvduuid); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not attach the file to cdrom: %s, rc=%08x"), + def->disks[i]->src, (unsigned)rc); + } else { + DEBUGIID("CD/DVDImage UUID:", dvduuid); } - if (dvdImage) { - rc = dvdImage->vtbl->imedium.GetId((IMedium *)dvdImage, &dvduuid); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("can't get the uuid of the file to " - "be attached to cdrom: %s, rc=%08x"), - def->disks[i]->src, (unsigned)rc); - } else { - rc = dvdDrive->vtbl->MountImage(dvdDrive, dvduuid); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not attach the file to cdrom: %s, rc=%08x"), - def->disks[i]->src, (unsigned)rc); - } else { - DEBUGIID("CD/DVDImage UUID:", dvduuid); - } - } - - VBOX_MEDIUM_RELEASE(dvdImage); - } - vboxIIDUnalloc(dvduuid); - VBOX_UTF16_FREE(dvdfileUtf16); - VBOX_RELEASE(dvdDrive); } - } else if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_BLOCK) { + + VBOX_MEDIUM_RELEASE(dvdImage); } - } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) { - if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_FILE && - def->disks[i]->src != NULL) { - IHardDisk *hardDisk = NULL; - PRUnichar *hddfileUtf16 = NULL; - vboxIID *hdduuid = NULL; - PRUnichar *hddEmpty = NULL; - /* Current Limitation: Harddisk can't be connected to - * Secondary Master as Secondary Master is always used - * for CD/DVD Drive, so don't connect the harddisk if it - * is requested to be connected to Secondary master - */ + vboxIIDUnalloc(dvduuid); + VBOX_UTF16_FREE(dvdfileUtf16); + VBOX_RELEASE(dvdDrive); + } + } else if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_BLOCK) { + } + } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) { + if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_FILE && + def->disks[i]->src != NULL) { + IHardDisk *hardDisk = NULL; + PRUnichar *hddfileUtf16 = NULL; + vboxIID *hdduuid = NULL; + PRUnichar *hddEmpty = NULL; + /* Current Limitation: Harddisk can't be connected to + * Secondary Master as Secondary Master is always used + * for CD/DVD Drive, so don't connect the harddisk if it + * is requested to be connected to Secondary master + */ - VBOX_UTF8_TO_UTF16(def->disks[i]->src, &hddfileUtf16); - VBOX_UTF8_TO_UTF16("", &hddEmpty); + VBOX_UTF8_TO_UTF16(def->disks[i]->src, &hddfileUtf16); + VBOX_UTF8_TO_UTF16("", &hddEmpty); - data->vboxObj->vtbl->FindHardDisk(data->vboxObj, hddfileUtf16, &hardDisk); + data->vboxObj->vtbl->FindHardDisk(data->vboxObj, hddfileUtf16, + &hardDisk); - if (!hardDisk) { + if (!hardDisk) { # if VBOX_API_VERSION == 2002 - data->vboxObj->vtbl->OpenHardDisk(data->vboxObj, - hddfileUtf16, - AccessMode_ReadWrite, - &hardDisk); + data->vboxObj->vtbl->OpenHardDisk(data->vboxObj, + hddfileUtf16, + AccessMode_ReadWrite, + &hardDisk); # else - data->vboxObj->vtbl->OpenHardDisk(data->vboxObj, - hddfileUtf16, - AccessMode_ReadWrite, - 0, - hddEmpty, - 0, - hddEmpty, - &hardDisk); + data->vboxObj->vtbl->OpenHardDisk(data->vboxObj, + hddfileUtf16, + AccessMode_ReadWrite, + 0, + hddEmpty, + 0, + hddEmpty, + &hardDisk); # endif - } + } - if (hardDisk) { - rc = hardDisk->vtbl->imedium.GetId((IMedium *)hardDisk, &hdduuid); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("can't get the uuid of the file to be " - "attached as harddisk: %s, rc=%08x"), - def->disks[i]->src, (unsigned)rc); + if (hardDisk) { + rc = hardDisk->vtbl->imedium.GetId((IMedium *)hardDisk, + &hdduuid); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("can't get the uuid of the file to be " + "attached as harddisk: %s, rc=%08x"), + def->disks[i]->src, (unsigned)rc); + } else { + if (def->disks[i]->readonly) { + hardDisk->vtbl->SetType(hardDisk, + HardDiskType_Immutable); + DEBUG0("setting harddisk to readonly"); + } else if (!def->disks[i]->readonly) { + hardDisk->vtbl->SetType(hardDisk, + HardDiskType_Normal); + DEBUG0("setting harddisk type to normal"); + } + if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_IDE) { + if (STREQ(def->disks[i]->dst, "hdc")) { + DEBUG0("Not connecting harddisk to hdc as hdc" + " is taken by CD/DVD Drive"); } else { - if (def->disks[i]->readonly) { - hardDisk->vtbl->SetType(hardDisk, HardDiskType_Immutable); - DEBUG0("setting harddisk to readonly"); - } else if (!def->disks[i]->readonly) { - hardDisk->vtbl->SetType(hardDisk, HardDiskType_Normal); - DEBUG0("setting harddisk type to normal"); + PRInt32 channel = 0; + PRInt32 device = 0; + PRUnichar *hddcnameUtf16 = NULL; + + char *hddcname = strdup("IDE"); + VBOX_UTF8_TO_UTF16(hddcname, &hddcnameUtf16); + VIR_FREE(hddcname); + + if (STREQ(def->disks[i]->dst, "hda")) { + channel = 0; + device = 0; + } else if (STREQ(def->disks[i]->dst, "hdb")) { + channel = 0; + device = 1; + } else if (STREQ(def->disks[i]->dst, "hdd")) { + channel = 1; + device = 1; } - if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_IDE) { - if (STREQ(def->disks[i]->dst, "hdc")) { - DEBUG0("Not connecting harddisk to hdc as hdc" - " is taken by CD/DVD Drive"); - } else { - PRInt32 channel = 0; - PRInt32 device = 0; - PRUnichar *hddcnameUtf16 = NULL; - - char *hddcname = strdup("IDE"); - VBOX_UTF8_TO_UTF16(hddcname, &hddcnameUtf16); - VIR_FREE(hddcname); - - if (STREQ(def->disks[i]->dst, "hda")) { - channel = 0; - device = 0; - } else if (STREQ(def->disks[i]->dst, "hdb")) { - channel = 0; - device = 1; - } else if (STREQ(def->disks[i]->dst, "hdd")) { - channel = 1; - device = 1; - } - rc = machine->vtbl->AttachHardDisk(machine, - hdduuid, - hddcnameUtf16, - channel, - device); - VBOX_UTF16_FREE(hddcnameUtf16); + rc = machine->vtbl->AttachHardDisk(machine, + hdduuid, + hddcnameUtf16, + channel, + device); + VBOX_UTF16_FREE(hddcnameUtf16); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not attach the file as " - "harddisk: %s, rc=%08x"), - def->disks[i]->src, (unsigned)rc); - } else { - DEBUGIID("Attached HDD with UUID", hdduuid); - } - } + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not attach the file as " + "harddisk: %s, rc=%08x"), + def->disks[i]->src, (unsigned)rc); + } else { + DEBUGIID("Attached HDD with UUID", hdduuid); } } - VBOX_MEDIUM_RELEASE(hardDisk); } - vboxIIDUnalloc(hdduuid); - VBOX_UTF16_FREE(hddEmpty); - VBOX_UTF16_FREE(hddfileUtf16); - } else if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_BLOCK) { } - } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) { - if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_FILE && - def->disks[i]->src != NULL) { - 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 = NULL; + VBOX_MEDIUM_RELEASE(hardDisk); + } + vboxIIDUnalloc(hdduuid); + VBOX_UTF16_FREE(hddEmpty); + VBOX_UTF16_FREE(hddfileUtf16); + } else if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_BLOCK) { + } + } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) { + if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_FILE && + def->disks[i]->src != NULL) { + 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 = NULL; # if VBOX_API_VERSION == 2002 - nsID fdemptyuuid; + nsID fdemptyuuid; - memset(&fdemptyuuid, 0, sizeof(fdemptyuuid)); + memset(&fdemptyuuid, 0, sizeof(fdemptyuuid)); # else - PRUnichar *fdemptyuuidUtf16 = NULL; + PRUnichar *fdemptyuuidUtf16 = NULL; # endif - VBOX_UTF8_TO_UTF16(def->disks[i]->src, &fdfileUtf16); - rc = data->vboxObj->vtbl->FindFloppyImage(data->vboxObj, - fdfileUtf16, - &floppyImage); + VBOX_UTF8_TO_UTF16(def->disks[i]->src, &fdfileUtf16); + rc = data->vboxObj->vtbl->FindFloppyImage(data->vboxObj, + fdfileUtf16, + &floppyImage); - if (!floppyImage) { - data->vboxObj->vtbl->OpenFloppyImage(data->vboxObj, - fdfileUtf16, + if (!floppyImage) { + data->vboxObj->vtbl->OpenFloppyImage(data->vboxObj, + fdfileUtf16, # if VBOX_API_VERSION == 2002 - &fdemptyuuid, + &fdemptyuuid, # else - fdemptyuuidUtf16, + fdemptyuuidUtf16, # endif - &floppyImage); - } + &floppyImage); + } - if (floppyImage) { - rc = floppyImage->vtbl->imedium.GetId((IMedium *)floppyImage, &fduuid); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("can't get the uuid of the file to " - "be attached to floppy drive: %s, rc=%08x"), - def->disks[i]->src, (unsigned)rc); - } else { - rc = floppyDrive->vtbl->MountImage(floppyDrive, fduuid); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not attach the file to " - "floppy drive: %s, rc=%08x"), - def->disks[i]->src, (unsigned)rc); - } else { - DEBUGIID("floppyImage UUID", fduuid); - } - } - VBOX_MEDIUM_RELEASE(floppyImage); + if (floppyImage) { + rc = floppyImage->vtbl->imedium.GetId((IMedium *)floppyImage, + &fduuid); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("can't get the uuid of the file to " + "be attached to floppy drive: %s, rc=%08x"), + def->disks[i]->src, (unsigned)rc); + } else { + rc = floppyDrive->vtbl->MountImage(floppyDrive, + fduuid); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not attach the file to " + "floppy drive: %s, rc=%08x"), + def->disks[i]->src, (unsigned)rc); + } else { + DEBUGIID("floppyImage UUID", fduuid); } - vboxIIDUnalloc(fduuid); - VBOX_UTF16_FREE(fdfileUtf16); } - VBOX_RELEASE(floppyDrive); + VBOX_MEDIUM_RELEASE(floppyImage); } - } else if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_BLOCK) { + vboxIIDUnalloc(fduuid); + VBOX_UTF16_FREE(fdfileUtf16); } + VBOX_RELEASE(floppyDrive); } + } else if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_BLOCK) { } } - - } /* Finished:Block to attach the CDROM/DVD Drive and HardDisks to the VM */ - + } #else /* VBOX_API_VERSION >= 3001 */ + PRUint32 maxPortPerInst[StorageBus_Floppy + 1] = {}; + PRUint32 maxSlotPerPort[StorageBus_Floppy + 1] = {}; + PRUnichar *storageCtlName = NULL; + bool error = false; + + /* get the max port/slots/etc for the given storage bus */ + error = !vboxGetMaxPortSlotValues(data->vboxObj, maxPortPerInst, + maxSlotPerPort); + + /* add a storage controller for the mediums to be attached */ + /* this needs to change when multiple controller are supported for + * ver > 3.1 */ { - PRUint32 maxPortPerInst[StorageBus_Floppy + 1] = {}; - PRUint32 maxSlotPerPort[StorageBus_Floppy + 1] = {}; - PRUnichar *storageCtlName = NULL; - bool error = false; - int i = 0; - - /* get the max port/slots/etc for the given storage bus */ - error = !vboxGetMaxPortSlotValues(data->vboxObj, maxPortPerInst, maxSlotPerPort); - - /* add a storage controller for the mediums to be attached */ - /* this needs to change when multiple controller are supported for ver > 3.1 */ - { - IStorageController *storageCtl = NULL; - PRUnichar *sName = NULL; - - VBOX_UTF8_TO_UTF16("IDE Controller", &sName); - machine->vtbl->AddStorageController(machine, - sName, - StorageBus_IDE, - &storageCtl); - VBOX_UTF16_FREE(sName); - VBOX_RELEASE(storageCtl); - - VBOX_UTF8_TO_UTF16("SATA Controller", &sName); - machine->vtbl->AddStorageController(machine, - sName, - StorageBus_SATA, - &storageCtl); - VBOX_UTF16_FREE(sName); - VBOX_RELEASE(storageCtl); - - VBOX_UTF8_TO_UTF16("SCSI Controller", &sName); - machine->vtbl->AddStorageController(machine, - sName, - StorageBus_SCSI, - &storageCtl); - VBOX_UTF16_FREE(sName); - VBOX_RELEASE(storageCtl); - - VBOX_UTF8_TO_UTF16("Floppy Controller", &sName); - machine->vtbl->AddStorageController(machine, - sName, - StorageBus_Floppy, - &storageCtl); - VBOX_UTF16_FREE(sName); - VBOX_RELEASE(storageCtl); - } - - /* Started:Block to attach the CDROM/DVD Drive and HardDisks to the VM */ - for (i = 0; i < def->ndisks && !error; i++) { - DEBUG("disk(%d) type: %d", i, def->disks[i]->type); - DEBUG("disk(%d) device: %d", i, def->disks[i]->device); - DEBUG("disk(%d) bus: %d", i, def->disks[i]->bus); - DEBUG("disk(%d) src: %s", i, def->disks[i]->src); - DEBUG("disk(%d) dst: %s", i, def->disks[i]->dst); - DEBUG("disk(%d) driverName: %s", i, def->disks[i]->driverName); - DEBUG("disk(%d) driverType: %s", i, def->disks[i]->driverType); - DEBUG("disk(%d) cachemode: %d", i, def->disks[i]->cachemode); - DEBUG("disk(%d) readonly: %s", i, def->disks[i]->readonly ? "True" : "False"); - DEBUG("disk(%d) shared: %s", i, def->disks[i]->shared ? "True" : "False"); + IStorageController *storageCtl = NULL; + PRUnichar *sName = NULL; + + VBOX_UTF8_TO_UTF16("IDE Controller", &sName); + machine->vtbl->AddStorageController(machine, + sName, + StorageBus_IDE, + &storageCtl); + VBOX_UTF16_FREE(sName); + VBOX_RELEASE(storageCtl); + + VBOX_UTF8_TO_UTF16("SATA Controller", &sName); + machine->vtbl->AddStorageController(machine, + sName, + StorageBus_SATA, + &storageCtl); + VBOX_UTF16_FREE(sName); + VBOX_RELEASE(storageCtl); + + VBOX_UTF8_TO_UTF16("SCSI Controller", &sName); + machine->vtbl->AddStorageController(machine, + sName, + StorageBus_SCSI, + &storageCtl); + VBOX_UTF16_FREE(sName); + VBOX_RELEASE(storageCtl); + + VBOX_UTF8_TO_UTF16("Floppy Controller", &sName); + machine->vtbl->AddStorageController(machine, + sName, + StorageBus_Floppy, + &storageCtl); + VBOX_UTF16_FREE(sName); + VBOX_RELEASE(storageCtl); + } + + for (i = 0; i < def->ndisks && !error; i++) { + DEBUG("disk(%d) type: %d", i, def->disks[i]->type); + DEBUG("disk(%d) device: %d", i, def->disks[i]->device); + DEBUG("disk(%d) bus: %d", i, def->disks[i]->bus); + DEBUG("disk(%d) src: %s", i, def->disks[i]->src); + DEBUG("disk(%d) dst: %s", i, def->disks[i]->dst); + DEBUG("disk(%d) driverName: %s", i, def->disks[i]->driverName); + DEBUG("disk(%d) driverType: %s", i, def->disks[i]->driverType); + DEBUG("disk(%d) cachemode: %d", i, def->disks[i]->cachemode); + DEBUG("disk(%d) readonly: %s", i, (def->disks[i]->readonly + ? "True" : "False")); + DEBUG("disk(%d) shared: %s", i, (def->disks[i]->shared + ? "True" : "False")); + + if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_FILE && + def->disks[i]->src != NULL) { + IMedium *medium = NULL; + PRUnichar *mediumUUID = NULL; + PRUnichar *mediumFileUtf16 = NULL; + PRUint32 storageBus = StorageBus_Null; + PRUint32 deviceType = DeviceType_Null; + PRInt32 deviceInst = 0; + PRInt32 devicePort = 0; + PRInt32 deviceSlot = 0; + + VBOX_UTF8_TO_UTF16(def->disks[i]->src, &mediumFileUtf16); + + if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) { + deviceType = DeviceType_HardDisk; + data->vboxObj->vtbl->FindHardDisk(data->vboxObj, + mediumFileUtf16, &medium); + } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM) { + deviceType = DeviceType_DVD; + data->vboxObj->vtbl->FindDVDImage(data->vboxObj, + mediumFileUtf16, &medium); + } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) { + deviceType = DeviceType_Floppy; + data->vboxObj->vtbl->FindFloppyImage(data->vboxObj, + mediumFileUtf16, &medium); + } else { + VBOX_UTF16_FREE(mediumFileUtf16); + continue; + } - if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_FILE && - def->disks[i]->src != NULL) { - IMedium *medium = NULL; - PRUnichar *mediumUUID = NULL; - PRUnichar *mediumFileUtf16 = NULL; - PRUint32 storageBus = StorageBus_Null; - PRUint32 deviceType = DeviceType_Null; - PRInt32 deviceInst = 0; - PRInt32 devicePort = 0; - PRInt32 deviceSlot = 0; + if (!medium) { + PRUnichar *mediumEmpty = NULL; - VBOX_UTF8_TO_UTF16(def->disks[i]->src, &mediumFileUtf16); + VBOX_UTF8_TO_UTF16("", &mediumEmpty); if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) { - deviceType = DeviceType_HardDisk; - data->vboxObj->vtbl->FindHardDisk(data->vboxObj, mediumFileUtf16, &medium); - } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM) { - deviceType = DeviceType_DVD; - data->vboxObj->vtbl->FindDVDImage(data->vboxObj, mediumFileUtf16, &medium); - } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) { - deviceType = DeviceType_Floppy; - data->vboxObj->vtbl->FindFloppyImage(data->vboxObj, mediumFileUtf16, &medium); - } else { - VBOX_UTF16_FREE(mediumFileUtf16); - continue; + data->vboxObj->vtbl->OpenHardDisk(data->vboxObj, + mediumFileUtf16, + AccessMode_ReadWrite, + false, + mediumEmpty, + false, + mediumEmpty, + &medium); + } else if (def->disks[i]->device == + VIR_DOMAIN_DISK_DEVICE_CDROM) { + data->vboxObj->vtbl->OpenDVDImage(data->vboxObj, + mediumFileUtf16, + mediumEmpty, + &medium); + } else if (def->disks[i]->device == + VIR_DOMAIN_DISK_DEVICE_FLOPPY) { + data->vboxObj->vtbl->OpenFloppyImage(data->vboxObj, + mediumFileUtf16, + mediumEmpty, + &medium); } - if (!medium) { - PRUnichar *mediumEmpty = NULL; - - VBOX_UTF8_TO_UTF16("", &mediumEmpty); - - if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) { - data->vboxObj->vtbl->OpenHardDisk(data->vboxObj, - mediumFileUtf16, - AccessMode_ReadWrite, - false, - mediumEmpty, - false, - mediumEmpty, - &medium); - } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM) { - data->vboxObj->vtbl->OpenDVDImage(data->vboxObj, - mediumFileUtf16, - mediumEmpty, - &medium); - } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) { - data->vboxObj->vtbl->OpenFloppyImage(data->vboxObj, - mediumFileUtf16, - mediumEmpty, - &medium); - } - - VBOX_UTF16_FREE(mediumEmpty); - } - - if (!medium) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("Failed to attach the following disk/dvd/floppy " - "to the machine: %s, rc=%08x"), - def->disks[i]->src, (unsigned)rc); - VBOX_UTF16_FREE(mediumFileUtf16); - continue; - } - - rc = medium->vtbl->GetId(medium, &mediumUUID); - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("can't get the uuid of the file to be attached " - "as harddisk/dvd/floppy: %s, rc=%08x"), - def->disks[i]->src, (unsigned)rc); - VBOX_RELEASE(medium); - VBOX_UTF16_FREE(mediumFileUtf16); - continue; - } + VBOX_UTF16_FREE(mediumEmpty); + } - if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) { - if (def->disks[i]->readonly) { - medium->vtbl->SetType(medium, MediumType_Immutable); - DEBUG0("setting harddisk to immutable"); - } else if (!def->disks[i]->readonly) { - medium->vtbl->SetType(medium, MediumType_Normal); - DEBUG0("setting harddisk type to normal"); - } - } + if (!medium) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("Failed to attach the following disk/dvd/floppy " + "to the machine: %s, rc=%08x"), + def->disks[i]->src, (unsigned)rc); + VBOX_UTF16_FREE(mediumFileUtf16); + continue; + } - if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_IDE) { - VBOX_UTF8_TO_UTF16("IDE Controller", &storageCtlName); - storageBus = StorageBus_IDE; - } else if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_SATA) { - VBOX_UTF8_TO_UTF16("SATA Controller", &storageCtlName); - storageBus = StorageBus_SATA; - } else if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_SCSI) { - VBOX_UTF8_TO_UTF16("SCSI Controller", &storageCtlName); - storageBus = StorageBus_SCSI; - } else if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_FDC) { - VBOX_UTF8_TO_UTF16("Floppy Controller", &storageCtlName); - storageBus = StorageBus_Floppy; - } + rc = medium->vtbl->GetId(medium, &mediumUUID); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("can't get the uuid of the file to be attached " + "as harddisk/dvd/floppy: %s, rc=%08x"), + def->disks[i]->src, (unsigned)rc); + VBOX_RELEASE(medium); + VBOX_UTF16_FREE(mediumFileUtf16); + continue; + } - /* get the device details i.e instance, port and slot */ - if (!vboxGetDeviceDetails(def->disks[i]->dst, - maxPortPerInst, - maxSlotPerPort, - storageBus, - &deviceInst, - &devicePort, - &deviceSlot)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("can't get the port/slot number of harddisk/" - "dvd/floppy to be attached: %s, rc=%08x"), - def->disks[i]->src, (unsigned)rc); - VBOX_RELEASE(medium); - VBOX_UTF16_FREE(mediumUUID); - VBOX_UTF16_FREE(mediumFileUtf16); - continue; + if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) { + if (def->disks[i]->readonly) { + medium->vtbl->SetType(medium, MediumType_Immutable); + DEBUG0("setting harddisk to immutable"); + } else if (!def->disks[i]->readonly) { + medium->vtbl->SetType(medium, MediumType_Normal); + DEBUG0("setting harddisk type to normal"); } + } - /* attach the harddisk/dvd/Floppy to the storage controller */ - rc = machine->vtbl->AttachDevice(machine, - storageCtlName, - devicePort, - deviceSlot, - deviceType, - mediumUUID); - - if (NS_FAILED(rc)) { - vboxError(VIR_ERR_INTERNAL_ERROR, - _("could not attach the file as harddisk/" - "dvd/floppy: %s, rc=%08x"), - def->disks[i]->src, (unsigned)rc); - } else { - DEBUGIID("Attached HDD/DVD/Floppy with UUID", mediumUUID); - } + if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_IDE) { + VBOX_UTF8_TO_UTF16("IDE Controller", &storageCtlName); + storageBus = StorageBus_IDE; + } else if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_SATA) { + VBOX_UTF8_TO_UTF16("SATA Controller", &storageCtlName); + storageBus = StorageBus_SATA; + } else if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_SCSI) { + VBOX_UTF8_TO_UTF16("SCSI Controller", &storageCtlName); + storageBus = StorageBus_SCSI; + } else if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_FDC) { + VBOX_UTF8_TO_UTF16("Floppy Controller", &storageCtlName); + storageBus = StorageBus_Floppy; + } + /* get the device details i.e instance, port and slot */ + if (!vboxGetDeviceDetails(def->disks[i]->dst, + maxPortPerInst, + maxSlotPerPort, + storageBus, + &deviceInst, + &devicePort, + &deviceSlot)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("can't get the port/slot number of harddisk/" + "dvd/floppy to be attached: %s, rc=%08x"), + def->disks[i]->src, (unsigned)rc); VBOX_RELEASE(medium); VBOX_UTF16_FREE(mediumUUID); VBOX_UTF16_FREE(mediumFileUtf16); - VBOX_UTF16_FREE(storageCtlName); + continue; + } + + /* attach the harddisk/dvd/Floppy to the storage controller */ + rc = machine->vtbl->AttachDevice(machine, + storageCtlName, + devicePort, + deviceSlot, + deviceType, + mediumUUID); + + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not attach the file as harddisk/" + "dvd/floppy: %s, rc=%08x"), + def->disks[i]->src, (unsigned)rc); + } else { + DEBUGIID("Attached HDD/DVD/Floppy with UUID", mediumUUID); } + + VBOX_RELEASE(medium); + VBOX_UTF16_FREE(mediumUUID); + VBOX_UTF16_FREE(mediumFileUtf16); + VBOX_UTF16_FREE(storageCtlName); } } - /* Finished:Block to attach the CDROM/DVD Drive and HardDisks to the VM */ #endif /* VBOX_API_VERSION >= 3001 */ +} - { /* Started:Block to attach the Sound Controller to the VM */ - /* Check if def->nsounds is one as VirtualBox currently supports - * only one sound card - */ - if (def->nsounds == 1) { - IAudioAdapter *audioAdapter = NULL; +static void +vboxAttachSound(virDomainDefPtr def, IMachine *machine) +{ + nsresult rc; - machine->vtbl->GetAudioAdapter(machine, &audioAdapter); - if (audioAdapter) { - rc = audioAdapter->vtbl->SetEnabled(audioAdapter, 1); - if (NS_SUCCEEDED(rc)) { - if (def->sounds[0]->model == VIR_DOMAIN_SOUND_MODEL_SB16) { - audioAdapter->vtbl->SetAudioController(audioAdapter, AudioControllerType_SB16); - } else if (def->sounds[0]->model == VIR_DOMAIN_SOUND_MODEL_AC97) { - audioAdapter->vtbl->SetAudioController(audioAdapter, AudioControllerType_AC97); - } + /* Check if def->nsounds is one as VirtualBox currently supports + * only one sound card + */ + if (def->nsounds == 1) { + IAudioAdapter *audioAdapter = NULL; + + machine->vtbl->GetAudioAdapter(machine, &audioAdapter); + if (audioAdapter) { + rc = audioAdapter->vtbl->SetEnabled(audioAdapter, 1); + if (NS_SUCCEEDED(rc)) { + if (def->sounds[0]->model == VIR_DOMAIN_SOUND_MODEL_SB16) { + audioAdapter->vtbl->SetAudioController(audioAdapter, + AudioControllerType_SB16); + } else if (def->sounds[0]->model == VIR_DOMAIN_SOUND_MODEL_AC97) { + audioAdapter->vtbl->SetAudioController(audioAdapter, + AudioControllerType_AC97); } - VBOX_RELEASE(audioAdapter); } + VBOX_RELEASE(audioAdapter); } - } /* Finished:Block to attach the Sound Controller to the VM */ - - { /* Started:Block to attach the Network Card to the VM */ - ISystemProperties *systemProperties = NULL; - PRUint32 networkAdapterCount = 0; - int i = 0; - - data->vboxObj->vtbl->GetSystemProperties(data->vboxObj, &systemProperties); - if (systemProperties) { - systemProperties->vtbl->GetNetworkAdapterCount(systemProperties, &networkAdapterCount); - VBOX_RELEASE(systemProperties); - systemProperties = NULL; + } +} + +static void +vboxAttachNetwork(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine) +{ + ISystemProperties *systemProperties = NULL; + PRUint32 networkAdapterCount = 0; + int i = 0; + + data->vboxObj->vtbl->GetSystemProperties(data->vboxObj, &systemProperties); + if (systemProperties) { + systemProperties->vtbl->GetNetworkAdapterCount(systemProperties, + &networkAdapterCount); + VBOX_RELEASE(systemProperties); + systemProperties = NULL; + } + + DEBUG("Number of Network Cards to be connected: %d", def->nnets); + DEBUG("Number of Network Cards available: %d", networkAdapterCount); + + for (i = 0; (i < def->nnets) && (i < networkAdapterCount); i++) { + INetworkAdapter *adapter = NULL; + PRUint32 adapterType = NetworkAdapterType_Null; + char macaddr[VIR_MAC_STRING_BUFLEN] = {0}; + char macaddrvbox[VIR_MAC_STRING_BUFLEN - 5] = {0}; + + virFormatMacAddr(def->nets[i]->mac, macaddr); + snprintf(macaddrvbox, VIR_MAC_STRING_BUFLEN - 5, + "%02X%02X%02X%02X%02X%02X", + def->nets[i]->mac[0], + def->nets[i]->mac[1], + def->nets[i]->mac[2], + def->nets[i]->mac[3], + def->nets[i]->mac[4], + def->nets[i]->mac[5]); + macaddrvbox[VIR_MAC_STRING_BUFLEN - 6] = '\0'; + + DEBUG("NIC(%d): Type: %d", i, def->nets[i]->type); + DEBUG("NIC(%d): Model: %s", i, def->nets[i]->model); + DEBUG("NIC(%d): Mac: %s", i, macaddr); + DEBUG("NIC(%d): ifname: %s", i, def->nets[i]->ifname); + if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_NETWORK) { + DEBUG("NIC(%d): name: %s", i, def->nets[i]->data.network.name); + } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_INTERNAL) { + DEBUG("NIC(%d): name: %s", i, def->nets[i]->data.internal.name); + } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_USER) { + DEBUG("NIC(%d): NAT.", i); + } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE) { + DEBUG("NIC(%d): brname: %s", i, def->nets[i]->data.bridge.brname); + DEBUG("NIC(%d): script: %s", i, def->nets[i]->data.bridge.script); + DEBUG("NIC(%d): ipaddr: %s", i, def->nets[i]->data.bridge.ipaddr); } - DEBUG("Number of Network Cards to be connected: %d", def->nnets); - DEBUG("Number of Network Cards available: %d", networkAdapterCount); - - for (i = 0; (i < def->nnets) && (i < networkAdapterCount); i++) { - INetworkAdapter *adapter = NULL; - PRUint32 adapterType = NetworkAdapterType_Null; - char macaddr[VIR_MAC_STRING_BUFLEN] = {0}; - char macaddrvbox[VIR_MAC_STRING_BUFLEN - 5] = {0}; - - virFormatMacAddr(def->nets[i]->mac, macaddr); - snprintf(macaddrvbox, VIR_MAC_STRING_BUFLEN - 5, - "%02X%02X%02X%02X%02X%02X", - def->nets[i]->mac[0], - def->nets[i]->mac[1], - def->nets[i]->mac[2], - def->nets[i]->mac[3], - def->nets[i]->mac[4], - def->nets[i]->mac[5]); - macaddrvbox[VIR_MAC_STRING_BUFLEN - 6] = '\0'; - - DEBUG("NIC(%d): Type: %d", i, def->nets[i]->type); - DEBUG("NIC(%d): Model: %s", i, def->nets[i]->model); - DEBUG("NIC(%d): Mac: %s", i, macaddr); - DEBUG("NIC(%d): ifname: %s", i, def->nets[i]->ifname); - if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_NETWORK) { - DEBUG("NIC(%d): name: %s", i, def->nets[i]->data.network.name); - } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_INTERNAL) { - DEBUG("NIC(%d): name: %s", i, def->nets[i]->data.internal.name); - } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_USER) { - DEBUG("NIC(%d): NAT.", i); - } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE) { - DEBUG("NIC(%d): brname: %s", i, def->nets[i]->data.bridge.brname); - DEBUG("NIC(%d): script: %s", i, def->nets[i]->data.bridge.script); - DEBUG("NIC(%d): ipaddr: %s", i, def->nets[i]->data.bridge.ipaddr); - } + machine->vtbl->GetNetworkAdapter(machine, i, &adapter); + if (adapter) { + PRUnichar *MACAddress = NULL; - machine->vtbl->GetNetworkAdapter(machine, i, &adapter); - if (adapter) { - PRUnichar *MACAddress = NULL; - - adapter->vtbl->SetEnabled(adapter, 1); - - if (def->nets[i]->model) { - if (STRCASEEQ(def->nets[i]->model , "Am79C970A")) { - adapterType = NetworkAdapterType_Am79C970A; - } else if (STRCASEEQ(def->nets[i]->model , "Am79C973")) { - adapterType = NetworkAdapterType_Am79C973; - } else if (STRCASEEQ(def->nets[i]->model , "82540EM")) { - adapterType = NetworkAdapterType_I82540EM; - } else if (STRCASEEQ(def->nets[i]->model , "82545EM")) { - adapterType = NetworkAdapterType_I82545EM; - } else if (STRCASEEQ(def->nets[i]->model , "82543GC")) { - adapterType = NetworkAdapterType_I82543GC; + adapter->vtbl->SetEnabled(adapter, 1); + + if (def->nets[i]->model) { + if (STRCASEEQ(def->nets[i]->model , "Am79C970A")) { + adapterType = NetworkAdapterType_Am79C970A; + } else if (STRCASEEQ(def->nets[i]->model , "Am79C973")) { + adapterType = NetworkAdapterType_Am79C973; + } else if (STRCASEEQ(def->nets[i]->model , "82540EM")) { + adapterType = NetworkAdapterType_I82540EM; + } else if (STRCASEEQ(def->nets[i]->model , "82545EM")) { + adapterType = NetworkAdapterType_I82545EM; + } else if (STRCASEEQ(def->nets[i]->model , "82543GC")) { + adapterType = NetworkAdapterType_I82543GC; #if VBOX_API_VERSION >= 3001 - } else if (STRCASEEQ(def->nets[i]->model , "virtio")) { - adapterType = NetworkAdapterType_Virtio; + } else if (STRCASEEQ(def->nets[i]->model , "virtio")) { + adapterType = NetworkAdapterType_Virtio; #endif /* VBOX_API_VERSION >= 3001 */ - } - } else { - adapterType = NetworkAdapterType_Am79C973; } + } else { + adapterType = NetworkAdapterType_Am79C973; + } - adapter->vtbl->SetAdapterType(adapter, adapterType); + adapter->vtbl->SetAdapterType(adapter, adapterType); - if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE) { - PRUnichar *hostInterface = NULL; - /* Bridged Network */ + if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE) { + PRUnichar *hostInterface = NULL; + /* Bridged Network */ - adapter->vtbl->AttachToBridgedInterface(adapter); + adapter->vtbl->AttachToBridgedInterface(adapter); - if (def->nets[i]->data.bridge.brname) { - VBOX_UTF8_TO_UTF16(def->nets[i]->data.bridge.brname, &hostInterface); - adapter->vtbl->SetHostInterface(adapter, hostInterface); - VBOX_UTF16_FREE(hostInterface); - } - } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_INTERNAL) { - PRUnichar *internalNetwork = NULL; - /* Internal Network */ - - adapter->vtbl->AttachToInternalNetwork(adapter); + if (def->nets[i]->data.bridge.brname) { + VBOX_UTF8_TO_UTF16(def->nets[i]->data.bridge.brname, + &hostInterface); + adapter->vtbl->SetHostInterface(adapter, hostInterface); + VBOX_UTF16_FREE(hostInterface); + } + } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_INTERNAL) { + PRUnichar *internalNetwork = NULL; + /* Internal Network */ - if (def->nets[i]->data.internal.name) { - VBOX_UTF8_TO_UTF16(def->nets[i]->data.internal.name, &internalNetwork); - adapter->vtbl->SetInternalNetwork(adapter, internalNetwork); - VBOX_UTF16_FREE(internalNetwork); - } - } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_NETWORK) { - PRUnichar *hostInterface = NULL; - /* Host Only Networking (currently only vboxnet0 available - * on *nix and mac, on windows you can create and configure - * as many as you want) - */ - adapter->vtbl->AttachToHostOnlyInterface(adapter); + adapter->vtbl->AttachToInternalNetwork(adapter); - if (def->nets[i]->data.network.name) { - VBOX_UTF8_TO_UTF16(def->nets[i]->data.network.name, &hostInterface); - adapter->vtbl->SetHostInterface(adapter, hostInterface); - VBOX_UTF16_FREE(hostInterface); - } - } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_USER) { - /* NAT */ - adapter->vtbl->AttachToNAT(adapter); - } else { - /* else always default to NAT if we don't understand - * what option is been passed to us - */ - adapter->vtbl->AttachToNAT(adapter); + if (def->nets[i]->data.internal.name) { + VBOX_UTF8_TO_UTF16(def->nets[i]->data.internal.name, + &internalNetwork); + adapter->vtbl->SetInternalNetwork(adapter, internalNetwork); + VBOX_UTF16_FREE(internalNetwork); } + } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_NETWORK) { + PRUnichar *hostInterface = NULL; + /* Host Only Networking (currently only vboxnet0 available + * on *nix and mac, on windows you can create and configure + * as many as you want) + */ + adapter->vtbl->AttachToHostOnlyInterface(adapter); - VBOX_UTF8_TO_UTF16(macaddrvbox, &MACAddress); - adapter->vtbl->SetMACAddress(adapter, MACAddress); - VBOX_UTF16_FREE(MACAddress); + if (def->nets[i]->data.network.name) { + VBOX_UTF8_TO_UTF16(def->nets[i]->data.network.name, + &hostInterface); + adapter->vtbl->SetHostInterface(adapter, hostInterface); + VBOX_UTF16_FREE(hostInterface); + } + } else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_USER) { + /* NAT */ + adapter->vtbl->AttachToNAT(adapter); + } else { + /* else always default to NAT if we don't understand + * what option is been passed to us + */ + adapter->vtbl->AttachToNAT(adapter); } + + VBOX_UTF8_TO_UTF16(macaddrvbox, &MACAddress); + adapter->vtbl->SetMACAddress(adapter, MACAddress); + VBOX_UTF16_FREE(MACAddress); } - } /* Finished:Block to attach the Network Card to the VM */ - - { /* Started:Block to attach the Serial Port to the VM */ - ISystemProperties *systemProperties = NULL; - PRUint32 serialPortCount = 0; - int i = 0; - - data->vboxObj->vtbl->GetSystemProperties(data->vboxObj, &systemProperties); - if (systemProperties) { - systemProperties->vtbl->GetSerialPortCount(systemProperties, &serialPortCount); - VBOX_RELEASE(systemProperties); - systemProperties = NULL; - } + } +} + +static void +vboxAttachSerial(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine) +{ + ISystemProperties *systemProperties = NULL; + PRUint32 serialPortCount = 0; + int i = 0; - DEBUG("Number of Serial Ports to be connected: %d", def->nserials); - DEBUG("Number of Serial Ports available: %d", serialPortCount); - for (i = 0; (i < def->nserials) && (i < serialPortCount); i++) { - ISerialPort *serialPort = NULL; + data->vboxObj->vtbl->GetSystemProperties(data->vboxObj, &systemProperties); + if (systemProperties) { + systemProperties->vtbl->GetSerialPortCount(systemProperties, + &serialPortCount); + VBOX_RELEASE(systemProperties); + systemProperties = NULL; + } - DEBUG("SerialPort(%d): Type: %d", i, def->serials[i]->type); - DEBUG("SerialPort(%d): target.port: %d", i, def->serials[i]->target.port); + DEBUG("Number of Serial Ports to be connected: %d", def->nserials); + DEBUG("Number of Serial Ports available: %d", serialPortCount); + for (i = 0; (i < def->nserials) && (i < serialPortCount); i++) { + ISerialPort *serialPort = NULL; - machine->vtbl->GetSerialPort(machine, i, &serialPort); - if (serialPort) { - PRUnichar *pathUtf16 = NULL; + DEBUG("SerialPort(%d): Type: %d", i, def->serials[i]->type); + DEBUG("SerialPort(%d): target.port: %d", i, + def->serials[i]->target.port); - serialPort->vtbl->SetEnabled(serialPort, 1); + machine->vtbl->GetSerialPort(machine, i, &serialPort); + if (serialPort) { + PRUnichar *pathUtf16 = NULL; - if (def->serials[i]->data.file.path) { - VBOX_UTF8_TO_UTF16(def->serials[i]->data.file.path, &pathUtf16); - serialPort->vtbl->SetPath(serialPort, pathUtf16); - } + serialPort->vtbl->SetEnabled(serialPort, 1); - /* For now hard code the serial ports to COM1 and COM2, - * COM1 (Base Addr: 0x3F8 (decimal: 1016), IRQ: 4) - * COM2 (Base Addr: 0x2F8 (decimal: 760), IRQ: 3) - * TODO: make this more flexible - */ - /* TODO: to improve the libvirt XMl handling so - * that def->serials[i]->target.port shows real port - * and not always start at 0 - */ - if (def->serials[i]->target.port == 0) { - serialPort->vtbl->SetIRQ(serialPort, 4); - serialPort->vtbl->SetIOBase(serialPort, 1016); - DEBUG(" serialPort-%d irq: %d, iobase 0x%x, path: %s", - i, 4, 1016, def->serials[i]->data.file.path); - } else if (def->serials[i]->target.port == 1) { - serialPort->vtbl->SetIRQ(serialPort, 3); - serialPort->vtbl->SetIOBase(serialPort, 760); - DEBUG(" serialPort-%d irq: %d, iobase 0x%x, path: %s", - i, 3, 760, def->serials[i]->data.file.path); - } + if (def->serials[i]->data.file.path) { + VBOX_UTF8_TO_UTF16(def->serials[i]->data.file.path, &pathUtf16); + serialPort->vtbl->SetPath(serialPort, pathUtf16); + } + + /* For now hard code the serial ports to COM1 and COM2, + * COM1 (Base Addr: 0x3F8 (decimal: 1016), IRQ: 4) + * COM2 (Base Addr: 0x2F8 (decimal: 760), IRQ: 3) + * TODO: make this more flexible + */ + /* TODO: to improve the libvirt XMl handling so + * that def->serials[i]->target.port shows real port + * and not always start at 0 + */ + if (def->serials[i]->target.port == 0) { + serialPort->vtbl->SetIRQ(serialPort, 4); + serialPort->vtbl->SetIOBase(serialPort, 1016); + DEBUG(" serialPort-%d irq: %d, iobase 0x%x, path: %s", + i, 4, 1016, def->serials[i]->data.file.path); + } else if (def->serials[i]->target.port == 1) { + serialPort->vtbl->SetIRQ(serialPort, 3); + serialPort->vtbl->SetIOBase(serialPort, 760); + DEBUG(" serialPort-%d irq: %d, iobase 0x%x, path: %s", + i, 3, 760, def->serials[i]->data.file.path); + } - if (def->serials[i]->type == VIR_DOMAIN_CHR_TYPE_DEV) { - serialPort->vtbl->SetHostMode(serialPort, PortMode_HostDevice); - } else if (def->serials[i]->type == VIR_DOMAIN_CHR_TYPE_PIPE) { - serialPort->vtbl->SetHostMode(serialPort, PortMode_HostPipe); + if (def->serials[i]->type == VIR_DOMAIN_CHR_TYPE_DEV) { + serialPort->vtbl->SetHostMode(serialPort, PortMode_HostDevice); + } else if (def->serials[i]->type == VIR_DOMAIN_CHR_TYPE_PIPE) { + serialPort->vtbl->SetHostMode(serialPort, PortMode_HostPipe); #if VBOX_API_VERSION >= 3000 - } else if (def->serials[i]->type == VIR_DOMAIN_CHR_TYPE_FILE) { - serialPort->vtbl->SetHostMode(serialPort, PortMode_RawFile); + } else if (def->serials[i]->type == VIR_DOMAIN_CHR_TYPE_FILE) { + serialPort->vtbl->SetHostMode(serialPort, PortMode_RawFile); #endif /* VBOX_API_VERSION >= 3000 */ - } else { - serialPort->vtbl->SetHostMode(serialPort, PortMode_Disconnected); - } + } else { + serialPort->vtbl->SetHostMode(serialPort, + PortMode_Disconnected); + } - VBOX_RELEASE(serialPort); - if (pathUtf16) { - VBOX_UTF16_FREE(pathUtf16); - pathUtf16 = NULL; - } + VBOX_RELEASE(serialPort); + if (pathUtf16) { + VBOX_UTF16_FREE(pathUtf16); + pathUtf16 = NULL; } } - } /* Finished:Block to attach the Serial Port to the VM */ - - { /* Started:Block to attach the Parallel Port to the VM */ - ISystemProperties *systemProperties = NULL; - PRUint32 parallelPortCount = 0; - int i = 0; - - data->vboxObj->vtbl->GetSystemProperties(data->vboxObj, &systemProperties); - if (systemProperties) { - systemProperties->vtbl->GetParallelPortCount(systemProperties, ¶llelPortCount); - VBOX_RELEASE(systemProperties); - systemProperties = NULL; - } + } +} - DEBUG("Number of Parallel Ports to be connected: %d", def->nparallels); - DEBUG("Number of Parallel Ports available: %d", parallelPortCount); - for (i = 0; (i < def->nparallels) && (i < parallelPortCount); i++) { - IParallelPort *parallelPort = NULL; +static void +vboxAttachParallel(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine) +{ + ISystemProperties *systemProperties = NULL; + PRUint32 parallelPortCount = 0; + int i = 0; - DEBUG("ParallelPort(%d): Type: %d", i, def->parallels[i]->type); - DEBUG("ParallelPort(%d): target.port: %d", i, def->parallels[i]->target.port); + data->vboxObj->vtbl->GetSystemProperties(data->vboxObj, &systemProperties); + if (systemProperties) { + systemProperties->vtbl->GetParallelPortCount(systemProperties, + ¶llelPortCount); + VBOX_RELEASE(systemProperties); + systemProperties = NULL; + } - machine->vtbl->GetParallelPort(machine, i, ¶llelPort); - if (parallelPort) { - PRUnichar *pathUtf16 = NULL; + DEBUG("Number of Parallel Ports to be connected: %d", def->nparallels); + DEBUG("Number of Parallel Ports available: %d", parallelPortCount); + for (i = 0; (i < def->nparallels) && (i < parallelPortCount); i++) { + IParallelPort *parallelPort = NULL; - VBOX_UTF8_TO_UTF16(def->parallels[i]->data.file.path, &pathUtf16); + DEBUG("ParallelPort(%d): Type: %d", i, def->parallels[i]->type); + DEBUG("ParallelPort(%d): target.port: %d", i, + def->parallels[i]->target.port); - /* For now hard code the parallel ports to - * LPT1 (Base Addr: 0x378 (decimal: 888), IRQ: 7) - * LPT2 (Base Addr: 0x278 (decimal: 632), IRQ: 5) - * TODO: make this more flexible - */ - if ((def->parallels[i]->type == VIR_DOMAIN_CHR_TYPE_DEV) || - (def->parallels[i]->type == VIR_DOMAIN_CHR_TYPE_PTY) || - (def->parallels[i]->type == VIR_DOMAIN_CHR_TYPE_FILE) || - (def->parallels[i]->type == VIR_DOMAIN_CHR_TYPE_PIPE)) { - parallelPort->vtbl->SetPath(parallelPort, pathUtf16); - if (i == 0) { - parallelPort->vtbl->SetIRQ(parallelPort, 7); - parallelPort->vtbl->SetIOBase(parallelPort, 888); - DEBUG(" parallePort-%d irq: %d, iobase 0x%x, path: %s", - i, 7, 888, def->parallels[i]->data.file.path); - } else if (i == 1) { - parallelPort->vtbl->SetIRQ(parallelPort, 5); - parallelPort->vtbl->SetIOBase(parallelPort, 632); - DEBUG(" parallePort-%d irq: %d, iobase 0x%x, path: %s", - i, 5, 632, def->parallels[i]->data.file.path); - } - } + machine->vtbl->GetParallelPort(machine, i, ¶llelPort); + if (parallelPort) { + PRUnichar *pathUtf16 = NULL; - /* like serial port, parallel port can't be enabled unless - * correct IRQ and IOBase values are specified. - */ - parallelPort->vtbl->SetEnabled(parallelPort, 1); + VBOX_UTF8_TO_UTF16(def->parallels[i]->data.file.path, &pathUtf16); - VBOX_RELEASE(parallelPort); - if (pathUtf16) { - VBOX_UTF16_FREE(pathUtf16); - pathUtf16 = NULL; + /* For now hard code the parallel ports to + * LPT1 (Base Addr: 0x378 (decimal: 888), IRQ: 7) + * LPT2 (Base Addr: 0x278 (decimal: 632), IRQ: 5) + * TODO: make this more flexible + */ + if ((def->parallels[i]->type == VIR_DOMAIN_CHR_TYPE_DEV) || + (def->parallels[i]->type == VIR_DOMAIN_CHR_TYPE_PTY) || + (def->parallels[i]->type == VIR_DOMAIN_CHR_TYPE_FILE) || + (def->parallels[i]->type == VIR_DOMAIN_CHR_TYPE_PIPE)) { + parallelPort->vtbl->SetPath(parallelPort, pathUtf16); + if (i == 0) { + parallelPort->vtbl->SetIRQ(parallelPort, 7); + parallelPort->vtbl->SetIOBase(parallelPort, 888); + DEBUG(" parallePort-%d irq: %d, iobase 0x%x, path: %s", + i, 7, 888, def->parallels[i]->data.file.path); + } else if (i == 1) { + parallelPort->vtbl->SetIRQ(parallelPort, 5); + parallelPort->vtbl->SetIOBase(parallelPort, 632); + DEBUG(" parallePort-%d irq: %d, iobase 0x%x, path: %s", + i, 5, 632, def->parallels[i]->data.file.path); } } + + /* like serial port, parallel port can't be enabled unless + * correct IRQ and IOBase values are specified. + */ + parallelPort->vtbl->SetEnabled(parallelPort, 1); + + VBOX_RELEASE(parallelPort); + if (pathUtf16) { + VBOX_UTF16_FREE(pathUtf16); + pathUtf16 = NULL; + } } - } /* Finished:Block to attach the Parallel Port to the VM */ - - { /* Started:Block to specify video card settings */ - if ((def->nvideos == 1) && (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_VBOX)) { - machine->vtbl->SetVRAMSize(machine, def->videos[0]->vram); - machine->vtbl->SetMonitorCount(machine, def->videos[0]->heads); - if (def->videos[0]->accel) { - machine->vtbl->SetAccelerate3DEnabled(machine, def->videos[0]->accel->support3d); + } +} + +static void +vboxAttachVideo(virDomainDefPtr def, IMachine *machine) +{ + if ((def->nvideos == 1) && + (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_VBOX)) { + machine->vtbl->SetVRAMSize(machine, def->videos[0]->vram); + machine->vtbl->SetMonitorCount(machine, def->videos[0]->heads); + if (def->videos[0]->accel) { + machine->vtbl->SetAccelerate3DEnabled(machine, + def->videos[0]->accel->support3d); #if VBOX_API_VERSION >= 3001 - machine->vtbl->SetAccelerate2DVideoEnabled(machine, def->videos[0]->accel->support2d); + machine->vtbl->SetAccelerate2DVideoEnabled(machine, + def->videos[0]->accel->support2d); #endif /* VBOX_API_VERSION >= 3001 */ - } else { - machine->vtbl->SetAccelerate3DEnabled(machine, 0); + } else { + machine->vtbl->SetAccelerate3DEnabled(machine, 0); #if VBOX_API_VERSION >= 3001 - machine->vtbl->SetAccelerate2DVideoEnabled(machine, 0); + machine->vtbl->SetAccelerate2DVideoEnabled(machine, 0); #endif /* VBOX_API_VERSION >= 3001 */ - } } - } /* Finished:Block to specify video card settings */ + } +} - { /* Started:Block to attach the Remote Display to VM */ - int vrdpPresent = 0; - int sdlPresent = 0; - int guiPresent = 0; - char *guiDisplay = NULL; - char *sdlDisplay = NULL; - int i = 0; +static void +vboxAttachDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine) +{ + int vrdpPresent = 0; + int sdlPresent = 0; + int guiPresent = 0; + char *guiDisplay = NULL; + char *sdlDisplay = NULL; + int i = 0; - for (i = 0; i < def->ngraphics; i++) { - IVRDPServer *VRDPServer = NULL; + for (i = 0; i < def->ngraphics; i++) { + IVRDPServer *VRDPServer = NULL; - if ((def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_RDP) && (vrdpPresent == 0)) { + if ((def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_RDP) && + (vrdpPresent == 0)) { - vrdpPresent = 1; - machine->vtbl->GetVRDPServer(machine, &VRDPServer); - if (VRDPServer) { - VRDPServer->vtbl->SetEnabled(VRDPServer, PR_TRUE); - DEBUG0("VRDP Support turned ON."); + vrdpPresent = 1; + machine->vtbl->GetVRDPServer(machine, &VRDPServer); + if (VRDPServer) { + VRDPServer->vtbl->SetEnabled(VRDPServer, PR_TRUE); + DEBUG0("VRDP Support turned ON."); #if VBOX_API_VERSION < 3001 - if (def->graphics[i]->data.rdp.port) { - VRDPServer->vtbl->SetPort(VRDPServer, def->graphics[i]->data.rdp.port); - DEBUG("VRDP Port changed to: %d", def->graphics[i]->data.rdp.port); - } else if (def->graphics[i]->data.rdp.autoport) { - /* Setting the port to 0 will reset its value to - * the default one which is 3389 currently - */ - VRDPServer->vtbl->SetPort(VRDPServer, 0); - DEBUG0("VRDP Port changed to default, which is 3389 currently"); - } + if (def->graphics[i]->data.rdp.port) { + VRDPServer->vtbl->SetPort(VRDPServer, + def->graphics[i]->data.rdp.port); + DEBUG("VRDP Port changed to: %d", + def->graphics[i]->data.rdp.port); + } else if (def->graphics[i]->data.rdp.autoport) { + /* Setting the port to 0 will reset its value to + * the default one which is 3389 currently + */ + VRDPServer->vtbl->SetPort(VRDPServer, 0); + DEBUG0("VRDP Port changed to default, which is 3389 currently"); + } #else /* VBOX_API_VERSION >= 3001 */ - PRUnichar *portUtf16 = NULL; - portUtf16 = PRUnicharFromInt(def->graphics[i]->data.rdp.port); - VRDPServer->vtbl->SetPorts(VRDPServer, portUtf16); - VBOX_UTF16_FREE(portUtf16); + PRUnichar *portUtf16 = NULL; + portUtf16 = PRUnicharFromInt(def->graphics[i]->data.rdp.port); + VRDPServer->vtbl->SetPorts(VRDPServer, portUtf16); + VBOX_UTF16_FREE(portUtf16); #endif /* VBOX_API_VERSION >= 3001 */ - if (def->graphics[i]->data.rdp.replaceUser) { - VRDPServer->vtbl->SetReuseSingleConnection(VRDPServer, PR_TRUE); - DEBUG0("VRDP set to reuse single connection"); - } - - if (def->graphics[i]->data.rdp.multiUser) { - VRDPServer->vtbl->SetAllowMultiConnection(VRDPServer, PR_TRUE); - DEBUG0("VRDP set to allow multiple connection"); - } + if (def->graphics[i]->data.rdp.replaceUser) { + VRDPServer->vtbl->SetReuseSingleConnection(VRDPServer, + PR_TRUE); + DEBUG0("VRDP set to reuse single connection"); + } - if (def->graphics[i]->data.rdp.listenAddr) { - PRUnichar *netAddressUtf16 = NULL; + if (def->graphics[i]->data.rdp.multiUser) { + VRDPServer->vtbl->SetAllowMultiConnection(VRDPServer, + PR_TRUE); + DEBUG0("VRDP set to allow multiple connection"); + } - VBOX_UTF8_TO_UTF16(def->graphics[i]->data.rdp.listenAddr, &netAddressUtf16); - VRDPServer->vtbl->SetNetAddress(VRDPServer, netAddressUtf16); - DEBUG("VRDP listen address is set to: %s", def->graphics[i]->data.rdp.listenAddr); + if (def->graphics[i]->data.rdp.listenAddr) { + PRUnichar *netAddressUtf16 = NULL; - VBOX_UTF16_FREE(netAddressUtf16); - } + VBOX_UTF8_TO_UTF16(def->graphics[i]->data.rdp.listenAddr, + &netAddressUtf16); + VRDPServer->vtbl->SetNetAddress(VRDPServer, + netAddressUtf16); + DEBUG("VRDP listen address is set to: %s", + def->graphics[i]->data.rdp.listenAddr); - VBOX_RELEASE(VRDPServer); + VBOX_UTF16_FREE(netAddressUtf16); } + + VBOX_RELEASE(VRDPServer); } + } - if ((def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP) && (guiPresent == 0)) { - guiPresent = 1; - if (def->graphics[i]->data.desktop.display) { - guiDisplay = strdup(def->graphics[i]->data.desktop.display); - if (guiDisplay == NULL) { - virReportOOMError(); - /* just don't go to cleanup yet as it is ok to have - * guiDisplay as NULL and we check it below if it - * exist and then only use it there - */ - } + if ((def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP) && + (guiPresent == 0)) { + guiPresent = 1; + if (def->graphics[i]->data.desktop.display) { + guiDisplay = strdup(def->graphics[i]->data.desktop.display); + if (guiDisplay == NULL) { + virReportOOMError(); + /* just don't go to cleanup yet as it is ok to have + * guiDisplay as NULL and we check it below if it + * exist and then only use it there + */ } } + } - if ((def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) && (sdlPresent == 0)) { - sdlPresent = 1; - if (def->graphics[i]->data.sdl.display) { - sdlDisplay = strdup(def->graphics[i]->data.sdl.display); - if (sdlDisplay == NULL) { - virReportOOMError(); - /* just don't go to cleanup yet as it is ok to have - * sdlDisplay as NULL and we check it below if it - * exist and then only use it there - */ - } + if ((def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) && + (sdlPresent == 0)) { + sdlPresent = 1; + if (def->graphics[i]->data.sdl.display) { + sdlDisplay = strdup(def->graphics[i]->data.sdl.display); + if (sdlDisplay == NULL) { + virReportOOMError(); + /* just don't go to cleanup yet as it is ok to have + * sdlDisplay as NULL and we check it below if it + * exist and then only use it there + */ } } } + } - if ((vrdpPresent == 1) && (guiPresent == 0) && (sdlPresent == 0)) { - /* store extradata key that frontend is set to vrdp */ - PRUnichar *keyTypeUtf16 = NULL; - PRUnichar *valueTypeUtf16 = NULL; + if ((vrdpPresent == 1) && (guiPresent == 0) && (sdlPresent == 0)) { + /* store extradata key that frontend is set to vrdp */ + PRUnichar *keyTypeUtf16 = NULL; + PRUnichar *valueTypeUtf16 = NULL; - VBOX_UTF8_TO_UTF16("FRONTEND/Type", &keyTypeUtf16); - VBOX_UTF8_TO_UTF16("vrdp", &valueTypeUtf16); + VBOX_UTF8_TO_UTF16("FRONTEND/Type", &keyTypeUtf16); + VBOX_UTF8_TO_UTF16("vrdp", &valueTypeUtf16); - machine->vtbl->SetExtraData(machine, keyTypeUtf16, valueTypeUtf16); + machine->vtbl->SetExtraData(machine, keyTypeUtf16, valueTypeUtf16); - VBOX_UTF16_FREE(keyTypeUtf16); - VBOX_UTF16_FREE(valueTypeUtf16); + VBOX_UTF16_FREE(keyTypeUtf16); + VBOX_UTF16_FREE(valueTypeUtf16); - } else if ((guiPresent == 0) && (sdlPresent == 1)) { - /* store extradata key that frontend is set to sdl */ - PRUnichar *keyTypeUtf16 = NULL; - PRUnichar *valueTypeUtf16 = NULL; - PRUnichar *keyDislpayUtf16 = NULL; - PRUnichar *valueDisplayUtf16 = NULL; + } else if ((guiPresent == 0) && (sdlPresent == 1)) { + /* store extradata key that frontend is set to sdl */ + PRUnichar *keyTypeUtf16 = NULL; + PRUnichar *valueTypeUtf16 = NULL; + PRUnichar *keyDislpayUtf16 = NULL; + PRUnichar *valueDisplayUtf16 = NULL; - VBOX_UTF8_TO_UTF16("FRONTEND/Type", &keyTypeUtf16); - VBOX_UTF8_TO_UTF16("sdl", &valueTypeUtf16); + VBOX_UTF8_TO_UTF16("FRONTEND/Type", &keyTypeUtf16); + VBOX_UTF8_TO_UTF16("sdl", &valueTypeUtf16); - machine->vtbl->SetExtraData(machine, keyTypeUtf16, valueTypeUtf16); + machine->vtbl->SetExtraData(machine, keyTypeUtf16, valueTypeUtf16); - VBOX_UTF16_FREE(keyTypeUtf16); - VBOX_UTF16_FREE(valueTypeUtf16); + VBOX_UTF16_FREE(keyTypeUtf16); + VBOX_UTF16_FREE(valueTypeUtf16); - if (sdlDisplay) { - VBOX_UTF8_TO_UTF16("FRONTEND/Display", &keyDislpayUtf16); - VBOX_UTF8_TO_UTF16(sdlDisplay, &valueDisplayUtf16); + if (sdlDisplay) { + VBOX_UTF8_TO_UTF16("FRONTEND/Display", &keyDislpayUtf16); + VBOX_UTF8_TO_UTF16(sdlDisplay, &valueDisplayUtf16); - machine->vtbl->SetExtraData(machine, keyDislpayUtf16, valueDisplayUtf16); + machine->vtbl->SetExtraData(machine, keyDislpayUtf16, + valueDisplayUtf16); - VBOX_UTF16_FREE(keyDislpayUtf16); - VBOX_UTF16_FREE(valueDisplayUtf16); - } + VBOX_UTF16_FREE(keyDislpayUtf16); + VBOX_UTF16_FREE(valueDisplayUtf16); + } - } else { - /* if all are set then default is gui, with vrdp turned on */ - PRUnichar *keyTypeUtf16 = NULL; - PRUnichar *valueTypeUtf16 = NULL; - PRUnichar *keyDislpayUtf16 = NULL; - PRUnichar *valueDisplayUtf16 = NULL; + } else { + /* if all are set then default is gui, with vrdp turned on */ + PRUnichar *keyTypeUtf16 = NULL; + PRUnichar *valueTypeUtf16 = NULL; + PRUnichar *keyDislpayUtf16 = NULL; + PRUnichar *valueDisplayUtf16 = NULL; - VBOX_UTF8_TO_UTF16("FRONTEND/Type", &keyTypeUtf16); - VBOX_UTF8_TO_UTF16("gui", &valueTypeUtf16); + VBOX_UTF8_TO_UTF16("FRONTEND/Type", &keyTypeUtf16); + VBOX_UTF8_TO_UTF16("gui", &valueTypeUtf16); - machine->vtbl->SetExtraData(machine, keyTypeUtf16, valueTypeUtf16); + machine->vtbl->SetExtraData(machine, keyTypeUtf16, valueTypeUtf16); - VBOX_UTF16_FREE(keyTypeUtf16); - VBOX_UTF16_FREE(valueTypeUtf16); + VBOX_UTF16_FREE(keyTypeUtf16); + VBOX_UTF16_FREE(valueTypeUtf16); - if (guiDisplay) { - VBOX_UTF8_TO_UTF16("FRONTEND/Display", &keyDislpayUtf16); - VBOX_UTF8_TO_UTF16(guiDisplay, &valueDisplayUtf16); + if (guiDisplay) { + VBOX_UTF8_TO_UTF16("FRONTEND/Display", &keyDislpayUtf16); + VBOX_UTF8_TO_UTF16(guiDisplay, &valueDisplayUtf16); - machine->vtbl->SetExtraData(machine, keyDislpayUtf16, valueDisplayUtf16); + machine->vtbl->SetExtraData(machine, keyDislpayUtf16, + valueDisplayUtf16); - VBOX_UTF16_FREE(keyDislpayUtf16); - VBOX_UTF16_FREE(valueDisplayUtf16); - } + VBOX_UTF16_FREE(keyDislpayUtf16); + VBOX_UTF16_FREE(valueDisplayUtf16); } + } - VIR_FREE(guiDisplay); - VIR_FREE(sdlDisplay); + VIR_FREE(guiDisplay); + VIR_FREE(sdlDisplay); +} - } /* Finished:Block to attach the Remote Display to VM */ +static void +vboxAttachUSB(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine) +{ + IUSBController *USBController = NULL; + int i = 0; + bool isUSB = false; + + if (def->nhostdevs == 0) + return; + + /* Loop through the devices first and see if you + * have a USB Device, only if you have one then + * start the USB controller else just proceed as + * usual + */ + for (i = 0; i < def->nhostdevs; i++) { + if (def->hostdevs[i]->mode == + VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { + if (def->hostdevs[i]->source.subsys.type == + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) { + if (def->hostdevs[i]->source.subsys.u.usb.vendor || + def->hostdevs[i]->source.subsys.u.usb.product) { + DEBUG("USB Device detected, VendorId:0x%x, ProductId:0x%x", + def->hostdevs[i]->source.subsys.u.usb.vendor, + def->hostdevs[i]->source.subsys.u.usb.product); + isUSB = true; + break; + } + } + } + } + + if (isUSB) { + /* First Start the USB Controller and then loop + * to attach USB Devices to it + */ + machine->vtbl->GetUSBController(machine, &USBController); + if (USBController) { + USBController->vtbl->SetEnabled(USBController, 1); + USBController->vtbl->SetEnabledEhci(USBController, 1); - { /* Started:Block to attach USB Devices to VM */ - if (def->nhostdevs > 0) { - IUSBController *USBController = NULL; - int i = 0, isUSB = 0; - /* Loop through the devices first and see if you - * have a USB Device, only if you have one then - * start the USB controller else just proceed as - * usual - */ for (i = 0; i < def->nhostdevs; i++) { if (def->hostdevs[i]->mode == - VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { + VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { if (def->hostdevs[i]->source.subsys.type == - VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) { - if (def->hostdevs[i]->source.subsys.u.usb.vendor || - def->hostdevs[i]->source.subsys.u.usb.product) { - DEBUG("USB Device detected, VendorId:0x%x, ProductId:0x%x", - def->hostdevs[i]->source.subsys.u.usb.vendor, - def->hostdevs[i]->source.subsys.u.usb.product); - isUSB++; - } - } - } - } + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) { - if (isUSB > 0) { - /* First Start the USB Controller and then loop - * to attach USB Devices to it - */ - machine->vtbl->GetUSBController(machine, &USBController); - if (USBController) { - USBController->vtbl->SetEnabled(USBController, 1); - USBController->vtbl->SetEnabledEhci(USBController, 1); - - for (i = 0; i < def->nhostdevs; i++) { - if (def->hostdevs[i]->mode == - VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { - if (def->hostdevs[i]->source.subsys.type == - VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) { - - char filtername[11] = {0}; - PRUnichar *filternameUtf16 = NULL; - IUSBDeviceFilter *filter = NULL; - - /* Assuming can't have more then 9999 devices so - * restricting to %04d - */ - sprintf(filtername, "filter%04d", i); - VBOX_UTF8_TO_UTF16(filtername, &filternameUtf16); - - USBController->vtbl->CreateDeviceFilter(USBController, - filternameUtf16, - &filter); - VBOX_UTF16_FREE(filternameUtf16); - - if (filter && - (def->hostdevs[i]->source.subsys.u.usb.vendor || - def->hostdevs[i]->source.subsys.u.usb.product)) { - - PRUnichar *vendorIdUtf16 = NULL; - char vendorId[40] = {0}; - PRUnichar *productIdUtf16 = NULL; - char productId[40] = {0}; - - if (def->hostdevs[i]->source.subsys.u.usb.vendor) { - sprintf(vendorId, "%x", def->hostdevs[i]->source.subsys.u.usb.vendor); - VBOX_UTF8_TO_UTF16(vendorId, &vendorIdUtf16); - filter->vtbl->SetVendorId(filter, vendorIdUtf16); - VBOX_UTF16_FREE(vendorIdUtf16); - } - if (def->hostdevs[i]->source.subsys.u.usb.product) { - sprintf(productId, "%x", def->hostdevs[i]->source.subsys.u.usb.product); - VBOX_UTF8_TO_UTF16(productId, &productIdUtf16); - filter->vtbl->SetProductId(filter, productIdUtf16); - VBOX_UTF16_FREE(productIdUtf16); - } - filter->vtbl->SetActive(filter, 1); - USBController->vtbl->InsertDeviceFilter(USBController, - i, - filter); - VBOX_RELEASE(filter); - } + char filtername[11] = {0}; + PRUnichar *filternameUtf16 = NULL; + IUSBDeviceFilter *filter = NULL; + /* Assuming can't have more then 9999 devices so + * restricting to %04d + */ + sprintf(filtername, "filter%04d", i); + VBOX_UTF8_TO_UTF16(filtername, &filternameUtf16); + + USBController->vtbl->CreateDeviceFilter(USBController, + filternameUtf16, + &filter); + VBOX_UTF16_FREE(filternameUtf16); + + if (filter && + (def->hostdevs[i]->source.subsys.u.usb.vendor || + def->hostdevs[i]->source.subsys.u.usb.product)) { + + PRUnichar *vendorIdUtf16 = NULL; + char vendorId[40] = {0}; + PRUnichar *productIdUtf16 = NULL; + char productId[40] = {0}; + + if (def->hostdevs[i]->source.subsys.u.usb.vendor) { + sprintf(vendorId, "%x", def->hostdevs[i]->source.subsys.u.usb.vendor); + VBOX_UTF8_TO_UTF16(vendorId, &vendorIdUtf16); + filter->vtbl->SetVendorId(filter, vendorIdUtf16); + VBOX_UTF16_FREE(vendorIdUtf16); + } + if (def->hostdevs[i]->source.subsys.u.usb.product) { + sprintf(productId, "%x", def->hostdevs[i]->source.subsys.u.usb.product); + VBOX_UTF8_TO_UTF16(productId, &productIdUtf16); + filter->vtbl->SetProductId(filter, + productIdUtf16); + VBOX_UTF16_FREE(productIdUtf16); } + filter->vtbl->SetActive(filter, 1); + USBController->vtbl->InsertDeviceFilter(USBController, + i, + filter); + VBOX_RELEASE(filter); } + } - VBOX_RELEASE(USBController); } } + VBOX_RELEASE(USBController); + } + } +} + +static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) { + VBOX_OBJECT_CHECK(conn, virDomainPtr, NULL); + IMachine *machine = NULL; + IBIOSSettings *bios = NULL; + vboxIID *iid = NULL; + vboxIID *mchiid = NULL; + virDomainDefPtr def = NULL; + PRUnichar *machineNameUtf16 = NULL; +#if VBOX_API_VERSION >= 3002 + PRBool override = PR_FALSE; +#endif + nsresult rc; + + if (!(def = virDomainDefParseString(data->caps, xml, + VIR_DOMAIN_XML_INACTIVE))) { + goto cleanup; + } + +#if VBOX_API_VERSION == 2002 + if (VIR_ALLOC(iid) < 0) { + virReportOOMError(); + goto cleanup; + } +#endif + + VBOX_UTF8_TO_UTF16(def->name, &machineNameUtf16); + vboxIIDFromUUID(def->uuid, iid); +#if VBOX_API_VERSION < 3002 + rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj, + machineNameUtf16, + NULL, + NULL, + iid, + &machine); +#else /* VBOX_API_VERSION >= 3002 */ + rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj, + machineNameUtf16, + NULL, + NULL, + iid, + override, + &machine); +#endif /* VBOX_API_VERSION >= 3002 */ + VBOX_UTF16_FREE(machineNameUtf16); + + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not define a domain, rc=%08x"), (unsigned)rc); + goto cleanup; + } + + rc = machine->vtbl->SetMemorySize(machine, def->memory / 1024); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not set the memory size of the domain to: %lu Kb, " + "rc=%08x"), + def->memory, (unsigned)rc); + } + + rc = machine->vtbl->SetCPUCount(machine, def->vcpus); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not set the number of virtual CPUs to: %lu, rc=%08x"), + def->vcpus, (unsigned)rc); + } + +#if VBOX_API_VERSION < 3001 + rc = machine->vtbl->SetPAEEnabled(machine, (def->features) & + (1 << VIR_DOMAIN_FEATURE_PAE)); +#elif VBOX_API_VERSION == 3001 + rc = machine->vtbl->SetCpuProperty(machine, CpuPropertyType_PAE, + (def->features) & + (1 << VIR_DOMAIN_FEATURE_PAE)); +#elif VBOX_API_VERSION >= 3002 + rc = machine->vtbl->SetCPUProperty(machine, CPUPropertyType_PAE, + (def->features) & + (1 << VIR_DOMAIN_FEATURE_PAE)); +#endif + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not change PAE status to: %s, rc=%08x"), + ((def->features) & (1 << VIR_DOMAIN_FEATURE_PAE)) + ? _("Enabled") : _("Disabled"), (unsigned)rc); + } + + machine->vtbl->GetBIOSSettings(machine, &bios); + if (bios) { + rc = bios->vtbl->SetACPIEnabled(bios, (def->features) & + (1 << VIR_DOMAIN_FEATURE_ACPI)); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not change ACPI status to: %s, rc=%08x"), + ((def->features) & (1 << VIR_DOMAIN_FEATURE_ACPI)) + ? _("Enabled") : _("Disabled"), (unsigned)rc); + } + rc = bios->vtbl->SetIOAPICEnabled(bios, (def->features) & + (1 << VIR_DOMAIN_FEATURE_APIC)); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not change APIC status to: %s, rc=%08x"), + ((def->features) & (1 << VIR_DOMAIN_FEATURE_APIC)) + ? _("Enabled") : _("Disabled"), (unsigned)rc); } - } /* Finished:Block to attach USB Devices to VM */ + VBOX_RELEASE(bios); + } + + /* Register the machine before attaching other devices to it */ + rc = data->vboxObj->vtbl->RegisterMachine(data->vboxObj, machine); + if (NS_FAILED(rc)) { + vboxError(VIR_ERR_INTERNAL_ERROR, + _("could not define a domain, rc=%08x"), (unsigned)rc); + goto cleanup; + } + + /* Get the uuid of the machine, currently it is immutable + * object so open a session to it and get it back, so that + * you can make changes to the machine setting + */ + machine->vtbl->GetId(machine, &mchiid); + data->vboxObj->vtbl->OpenSession(data->vboxObj, data->vboxSession, mchiid); + data->vboxSession->vtbl->GetMachine(data->vboxSession, &machine); + + vboxSetBootDeviceOrder(def, data, machine); + vboxAttachDrives(def, data, machine); + vboxAttachSound(def, machine); + vboxAttachNetwork(def, data, machine); + vboxAttachSerial(def, data, machine); + vboxAttachParallel(def, data, machine); + vboxAttachVideo(def, machine); + vboxAttachDisplay(def, data, machine); + vboxAttachUSB(def, data, machine); /* Save the machine settings made till now and close the * session. also free up the mchiid variable used. -- 1.7.2.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list