--- src/vbox/vbox_common.c | 73 +++++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 73 ----------------------------------------- src/vbox/vbox_uniformed_api.h | 2 ++ 3 files changed, 75 insertions(+), 73 deletions(-) diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index d901b7f..5d9a4f0 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -624,3 +624,76 @@ virDomainPtr vboxDomainLookupByID(virConnectPtr conn, int id) gVBoxAPI.UArray.vboxArrayRelease(&machines); return ret; } + +virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn, + const unsigned char *uuid) +{ + VBOX_OBJECT_CHECK(conn, virDomainPtr, NULL); + vboxArray machines = VBOX_ARRAY_INITIALIZER; + vboxIIDUnion iid; + char *machineNameUtf8 = NULL; + PRUnichar *machineNameUtf16 = NULL; + unsigned char iid_as_uuid[VIR_UUID_BUFLEN]; + size_t i; + int matched = 0; + nsresult rc; + + VBOX_IID_INITIALIZE(&iid); + rc = gVBoxAPI.UArray.vboxArrayGet(&machines, data->vboxObj, ARRAY_GET_MACHINES); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Could not get list of machines, rc=%08x"), (unsigned)rc); + return NULL; + } + + for (i = 0; i < machines.count; ++i) { + IMachine *machine = machines.items[i]; + PRBool isAccessible = PR_FALSE; + + if (!machine) + continue; + + gVBoxAPI.UIMachine.GetAccessible(machine, &isAccessible); + if (!isAccessible) + continue; + + rc = gVBoxAPI.UIMachine.GetId(machine, &iid); + if (NS_FAILED(rc)) + continue; + vboxIIDToUUID(&iid, iid_as_uuid); + vboxIIDUnalloc(&iid); + + if (memcmp(uuid, iid_as_uuid, VIR_UUID_BUFLEN) == 0) { + + PRUint32 state; + + matched = 1; + + gVBoxAPI.UIMachine.GetName(machine, &machineNameUtf16); + VBOX_UTF16_TO_UTF8(machineNameUtf16, &machineNameUtf8); + + gVBoxAPI.UIMachine.GetState(machine, &state); + + /* get a new domain pointer from virGetDomain, if it fails + * then no need to assign the id, else assign the id, cause + * it is -1 by default. rest is taken care by virGetDomain + * itself, so need not worry. + */ + + ret = virGetDomain(conn, machineNameUtf8, iid_as_uuid); + if (ret && + gVBoxAPI.machineStateChecker.Online(state)) + ret->id = i + 1; + } + + if (matched == 1) + break; + } + + /* Do the cleanup and take care you dont leak any memory */ + VBOX_UTF8_FREE(machineNameUtf8); + VBOX_COM_UNALLOC_MEM(machineNameUtf16); + gVBoxAPI.UArray.vboxArrayRelease(&machines); + + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 9018589..0f33605 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -949,79 +949,6 @@ static virDomainPtr vboxDomainCreateXML(virConnectPtr conn, const char *xml, } static virDomainPtr -vboxDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid) -{ - VBOX_OBJECT_CHECK(conn, virDomainPtr, NULL); - vboxArray machines = VBOX_ARRAY_INITIALIZER; - vboxIID iid = VBOX_IID_INITIALIZER; - char *machineNameUtf8 = NULL; - PRUnichar *machineNameUtf16 = NULL; - unsigned char iid_as_uuid[VIR_UUID_BUFLEN]; - size_t i; - int matched = 0; - nsresult rc; - - rc = vboxArrayGet(&machines, data->vboxObj, data->vboxObj->vtbl->GetMachines); - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Could not get list of machines, rc=%08x"), (unsigned)rc); - return NULL; - } - - for (i = 0; i < machines.count; ++i) { - IMachine *machine = machines.items[i]; - PRBool isAccessible = PR_FALSE; - - if (!machine) - continue; - - machine->vtbl->GetAccessible(machine, &isAccessible); - if (isAccessible) { - - rc = machine->vtbl->GetId(machine, &iid.value); - if (NS_FAILED(rc)) - continue; - vboxIIDToUUID(&iid, iid_as_uuid); - vboxIIDUnalloc(&iid); - - if (memcmp(uuid, iid_as_uuid, VIR_UUID_BUFLEN) == 0) { - - PRUint32 state; - - matched = 1; - - machine->vtbl->GetName(machine, &machineNameUtf16); - VBOX_UTF16_TO_UTF8(machineNameUtf16, &machineNameUtf8); - - machine->vtbl->GetState(machine, &state); - - /* get a new domain pointer from virGetDomain, if it fails - * then no need to assign the id, else assign the id, cause - * it is -1 by default. rest is taken care by virGetDomain - * itself, so need not worry. - */ - - ret = virGetDomain(conn, machineNameUtf8, iid_as_uuid); - if (ret && - (state >= MachineState_FirstOnline) && - (state <= MachineState_LastOnline)) - ret->id = i + 1; - } - - if (matched == 1) - break; - } - } - - /* Do the cleanup and take care you dont leak any memory */ - VBOX_UTF8_FREE(machineNameUtf8); - VBOX_COM_UNALLOC_MEM(machineNameUtf16); - vboxArrayRelease(&machines); - - return ret; -} - -static virDomainPtr vboxDomainLookupByName(virConnectPtr conn, const char *name) { VBOX_OBJECT_CHECK(conn, virDomainPtr, NULL); diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 26aec76..2541fba 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -260,6 +260,8 @@ char *vboxConnectGetCapabilities(virConnectPtr conn); int vboxConnectListDomains(virConnectPtr conn, int *ids, int nids); int vboxConnectNumOfDomains(virConnectPtr conn); virDomainPtr vboxDomainLookupByID(virConnectPtr conn, int id); +virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn, + const unsigned char *uuid); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list