return NULL;
}
+
+virDomainDefPtr virDomainDefNew(const char *name,
+ const unsigned char *uuid,
+ int id)
+{
+ virDomainDefPtr def;
+
+ if (VIR_ALLOC(def) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ if (VIR_STRDUP(def->name, name) < 0) {
+ VIR_FREE(def);
+ return NULL;
+ }
+
+ memcpy(def->uuid, uuid, VIR_UUID_BUFLEN);
+ def->id = id;
+
+ return def;
+}
+
+
void virDomainObjAssignDef(virDomainObjPtr domain,
const virDomainDefPtr def,
bool live,
virDomainChrDefPtr virDomainChrDefNew(void);
+virDomainDefPtr virDomainDefNew(const char *name,
+ const unsigned char *uuid,
+ int id);
+
enum {
VIR_DOMAIN_OBJ_LIST_ADD_LIVE = (1 << 0),
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE = (1 << 1),
virDomainDefGetDefaultEmulator;
virDomainDefGetSecurityLabelDef;
virDomainDefMaybeAddController;
+virDomainDefNew;
virDomainDefParseFile;
virDomainDefParseNode;
virDomainDefParseString;
static bool is_privileged = false;
+static virDomainDefPtr xenGetDomainDefForID(virConnectPtr conn, int id)
+{
+ virDomainDefPtr ret;
+
+ ret = xenHypervisorLookupDomainByID(conn, id);
+
+ if (!ret && virGetLastError() == NULL)
+ virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
+
+ return ret;
+}
+
+
+static virDomainDefPtr xenGetDomainDefForName(virConnectPtr conn, const char *name)
+{
+ xenUnifiedPrivatePtr priv = conn->privateData;
+ virDomainDefPtr ret;
+
+ ret = xenDaemonLookupByName(conn, name);
+
+ /* Try XM for inactive domains. */
+ if (!ret &&
+ priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3)
+ ret = xenXMDomainLookupByName(conn, name);
+
+ if (!ret && virGetLastError() == NULL)
+ virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
+
+ return ret;
+}
+
+
+static virDomainDefPtr xenGetDomainDefForUUID(virConnectPtr conn, const unsigned char *uuid)
+{
+ xenUnifiedPrivatePtr priv = conn->privateData;
+ virDomainDefPtr ret;
+
+ ret = xenHypervisorLookupDomainByUUID(conn, uuid);
+
+ /* Try XM for inactive domains. */
+ if (!ret) {
+ if (priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3)
+ ret = xenXMDomainLookupByUUID(conn, uuid);
+ else
+ ret = xenDaemonLookupByUUID(conn, uuid);
+ }
+
+ if (!ret && virGetLastError() == NULL)
+ virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
+
+ return ret;
+}
+
+
/**
* xenNumaInit:
* @conn: pointer to the hypervisor connection
xenUnifiedDomainLookupByID(virConnectPtr conn, int id)
{
virDomainPtr ret = NULL;
+ virDomainDefPtr def = NULL;
- ret = xenHypervisorLookupDomainByID(conn, id);
+ if (!(def = xenGetDomainDefForID(conn, id)))
+ goto cleanup;
- if (!ret && virGetLastError() == NULL)
- virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
+ if (!(ret = virGetDomain(conn, def->name, def->uuid)))
+ goto cleanup;
+ ret->id = def->id;
+
+cleanup:
+ virDomainDefFree(def);
return ret;
}
xenUnifiedDomainLookupByUUID(virConnectPtr conn,
const unsigned char *uuid)
{
- xenUnifiedPrivatePtr priv = conn->privateData;
- virDomainPtr ret;
+ virDomainPtr ret = NULL;
+ virDomainDefPtr def = NULL;
- ret = xenHypervisorLookupDomainByUUID(conn, uuid);
+ if (!(def = xenGetDomainDefForUUID(conn, uuid)))
+ goto cleanup;
- /* Try XM for inactive domains. */
- if (!ret) {
- if (priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3)
- ret = xenXMDomainLookupByUUID(conn, uuid);
- else
- ret = xenDaemonLookupByUUID(conn, uuid);
- }
+ if (!(ret = virGetDomain(conn, def->name, def->uuid)))
+ goto cleanup;
- if (!ret && virGetLastError() == NULL)
- virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
+ ret->id = def->id;
+cleanup:
+ virDomainDefFree(def);
return ret;
}
xenUnifiedDomainLookupByName(virConnectPtr conn,
const char *name)
{
- xenUnifiedPrivatePtr priv = conn->privateData;
- virDomainPtr ret;
+ virDomainPtr ret = NULL;
+ virDomainDefPtr def = NULL;
- ret = xenDaemonLookupByName(conn, name);
+ if (!(def = xenGetDomainDefForName(conn, name)))
+ goto cleanup;
- /* Try XM for inactive domains. */
- if (priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3)
- ret = xenXMDomainLookupByName(conn, name);
+ if (!(ret = virGetDomain(conn, def->name, def->uuid)))
+ goto cleanup;
- if (!ret && virGetLastError() == NULL)
- virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
+ ret->id = def->id;
+cleanup:
+ virDomainDefFree(def);
return ret;
}
static int
xenUnifiedDomainIsActive(virDomainPtr dom)
{
- xenUnifiedPrivatePtr priv = dom->conn->privateData;
- virDomainPtr currdom;
+ virDomainDefPtr def;
int ret = -1;
- /* ID field in dom may be outdated, so re-lookup */
- currdom = xenHypervisorLookupDomainByUUID(dom->conn, dom->uuid);
-
- /* Try XM for inactive domains. */
- if (!currdom) {
- if (priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3)
- currdom = xenXMDomainLookupByUUID(dom->conn, dom->uuid);
- else
- currdom = xenDaemonLookupByUUID(dom->conn, dom->uuid);
- }
+ if (!(def = xenGetDomainDefForUUID(dom->conn, dom->uuid)))
+ goto cleanup;
- if (currdom) {
- ret = currdom->id == -1 ? 0 : 1;
- virDomainFree(currdom);
- } else if (virGetLastError() == NULL) {
- virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__);
- }
+ ret = def->id == -1 ? 0 : 1;
+cleanup:
+ virDomainDefFree(def);
return ret;
}
xenUnifiedDomainIsPersistent(virDomainPtr dom)
{
xenUnifiedPrivatePtr priv = dom->conn->privateData;
- virDomainPtr currdom = NULL;
+ virDomainDefPtr def = NULL;
int ret = -1;
if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
/* Old Xen, pre-inactive domain management.
* If the XM driver can see the guest, it is definitely persistent */
- currdom = xenXMDomainLookupByUUID(dom->conn, dom->uuid);
- if (currdom)
+ def = xenXMDomainLookupByUUID(dom->conn, dom->uuid);
+ if (def)
ret = 1;
else
ret = 0;
} else {
/* New Xen with inactive domain management */
- currdom = xenDaemonLookupByUUID(dom->conn, dom->uuid);
- if (currdom) {
- if (currdom->id == -1) {
+ def = xenDaemonLookupByUUID(dom->conn, dom->uuid);
+ if (def) {
+ if (def->id == -1) {
/* If its inactive, then trivially, it must be persistent */
ret = 1;
} else {
virUUIDFormat(dom->uuid, uuidstr);
if (virAsprintf(&path, "%s/%s", XEND_DOMAINS_DIR, uuidstr) < 0) {
virReportOOMError();
- goto done;
+ goto cleanup;
}
if (access(path, R_OK) == 0)
ret = 1;
}
}
-done:
- if (currdom)
- virDomainFree(currdom);
+cleanup:
+ virDomainDefFree(def);
return ret;
}
return 1;
}
-virDomainPtr
+
+virDomainDefPtr
xenHypervisorLookupDomainByID(virConnectPtr conn, int id)
{
xenUnifiedPrivatePtr priv = conn->privateData;
xen_getdomaininfo dominfo;
- virDomainPtr ret;
+ virDomainDefPtr ret;
char *name;
XEN_GETDOMAININFO_CLEAR(dominfo);
if (!name)
return NULL;
- ret = virGetDomain(conn, name, XEN_GETDOMAININFO_UUID(dominfo));
- if (ret)
- ret->id = id;
+ ret = virDomainDefNew(name,
+ XEN_GETDOMAININFO_UUID(dominfo),
+ id);
VIR_FREE(name);
return ret;
}
-virDomainPtr
+virDomainDefPtr
xenHypervisorLookupDomainByUUID(virConnectPtr conn, const unsigned char *uuid)
{
xen_getdomaininfolist dominfos;
xenUnifiedPrivatePtr priv = conn->privateData;
- virDomainPtr ret;
+ virDomainDefPtr ret;
char *name;
int maxids = 100, nids, i, id;
if (!name)
return NULL;
- ret = virGetDomain(conn, name, uuid);
+ ret = virDomainDefNew(name, uuid, id);
if (ret)
ret->id = id;
VIR_FREE(name);
# include "capabilities.h"
# include "driver.h"
# include "viruri.h"
+# include "domain_conf.h"
/* See xenHypervisorInit() for details. */
struct xenHypervisorVersions {
int
xenHypervisorHasDomain(virConnectPtr conn,
int id);
-virDomainPtr
- xenHypervisorLookupDomainByID (virConnectPtr conn,
- int id);
-virDomainPtr
+virDomainDefPtr
+ xenHypervisorLookupDomainByID (virConnectPtr conn, int id);
+virDomainDefPtr
xenHypervisorLookupDomainByUUID (virConnectPtr conn,
const unsigned char *uuid);
char *
unsigned char *uuid)
{
int i;
- virDomainPtr dom;
+ virDomainDefPtr def;
const char *uuid_str;
unsigned char rawuuid[VIR_UUID_BUFLEN];
xenUnifiedPrivatePtr priv = conn->privateData;
be set during open while we are building our
initial list of domains */
VIR_DEBUG("Looking for dom with uuid: %s", uuid_str);
- /* XXX Should not have to go via a virDomainPtr obj instance */
- if (!(dom = xenDaemonLookupByUUID(conn, rawuuid))) {
+
+ if (!(def = xenDaemonLookupByUUID(conn, rawuuid))) {
/* If we are here, the domain has gone away.
search for, and create a domain from the stored
list info */
return -1;
}
- if (!(*name = strdup(dom->name))) {
+ if (!(*name = strdup(def->name))) {
virReportOOMError();
- virDomainFree(dom);
+ virDomainDefFree(def);
return -1;
}
- memcpy(uuid, dom->uuid, VIR_UUID_BUFLEN);
- virDomainFree(dom);
+ memcpy(uuid, def->uuid, VIR_UUID_BUFLEN);
+ virDomainDefFree(def);
/* succeeded too find domain by uuid */
return 0;
}
*
* Internal routine returning the associated virDomainPtr for this domain
*
- * Returns the domain pointer or NULL in case of error.
+ * Returns the domain def pointer or NULL in case of error.
*/
-static virDomainPtr
+static virDomainDefPtr
sexpr_to_domain(virConnectPtr conn, const struct sexpr *root)
{
- virDomainPtr ret = NULL;
+ virDomainDefPtr ret = NULL;
unsigned char uuid[VIR_UUID_BUFLEN];
const char *name;
const char *tmp;
+ int id = -1;
xenUnifiedPrivatePtr priv = conn->privateData;
if (sexpr_uuid(uuid, root, "domain/uuid") < 0)
if (name == NULL)
goto error;
- ret = virGetDomain(conn, name, uuid);
- if (ret == NULL) return NULL;
-
tmp = sexpr_node(root, "domain/domid");
/* New 3.0.4 XenD will not report a domid for inactive domains,
* so only error out for old XenD
goto error;
if (tmp)
- ret->id = sexpr_int(root, "domain/domid");
- else
- ret->id = -1; /* An inactive domain */
+ id = sexpr_int(root, "domain/domid");
- return ret;
+ return virDomainDefNew(name, uuid, id);
error:
virReportError(VIR_ERR_INTERNAL_ERROR,
* it in the form of a struct xend_domain. This should be
* free()'d when no longer needed.
*
- * Returns domain info on success; NULL (with errno) on error
+ * Returns domain def pointer on success; NULL on error
*/
-virDomainPtr
+virDomainDefPtr
xenDaemonLookupByName(virConnectPtr conn, const char *domname)
{
struct sexpr *root;
- virDomainPtr ret = NULL;
+ virDomainDefPtr ret = NULL;
root = sexpr_get(conn, "/xend/domain/%s?detail=1", domname);
if (root == NULL)
*
* Try to lookup a domain on xend based on its UUID.
*
- * Returns a new domain object or NULL in case of failure
+ * Returns domain def pointer on success; NULL on error
*/
-virDomainPtr
+virDomainDefPtr
xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
{
- virDomainPtr ret;
+ virDomainDefPtr ret;
char *name = NULL;
int id = -1;
xenUnifiedPrivatePtr priv = conn->privateData;
if (name == NULL)
return NULL;
- ret = virGetDomain(conn, name, uuid);
- if (ret == NULL) goto cleanup;
-
- ret->id = id;
+ ret = virDomainDefNew(name, uuid, id);
- cleanup:
VIR_FREE(name);
return ret;
}
int autostart);
virDomainPtr xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc);
-virDomainPtr xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid);
-virDomainPtr xenDaemonLookupByName(virConnectPtr conn, const char *domname);
+virDomainDefPtr xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid);
+virDomainDefPtr xenDaemonLookupByName(virConnectPtr conn, const char *domname);
int xenDaemonDomainMigratePrepare (virConnectPtr dconn, char **cookie, int *cookielen, const char *uri_in, char **uri_out, unsigned long flags, const char *dname, unsigned long resource);
int xenDaemonDomainMigratePerform (virDomainPtr domain, const char *cookie, int cookielen, const char *uri, unsigned long flags, const char *dname, unsigned long resource);
/*
* Find an inactive domain based on its name
*/
-virDomainPtr
+virDomainDefPtr
xenXMDomainLookupByName(virConnectPtr conn, const char *domname)
{
xenUnifiedPrivatePtr priv = conn->privateData;
const char *filename;
xenXMConfCachePtr entry;
- virDomainPtr ret = NULL;
+ virDomainDefPtr ret = NULL;
xenUnifiedLock(priv);
if (!(entry = virHashLookup(priv->configCache, filename)))
goto cleanup;
- if (!(ret = virGetDomain(conn, domname, entry->def->uuid)))
- goto cleanup;
-
- /* Ensure its marked inactive, because may be cached
- handle to a previously active domain */
- ret->id = -1;
+ ret = virDomainDefNew(domname, entry->def->uuid, -1);
cleanup:
xenUnifiedUnlock(priv);
/*
* Find an inactive domain based on its UUID
*/
-virDomainPtr
+virDomainDefPtr
xenXMDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
{
xenUnifiedPrivatePtr priv = conn->privateData;
xenXMConfCachePtr entry;
- virDomainPtr ret = NULL;
+ virDomainDefPtr ret = NULL;
xenUnifiedLock(priv);
if (!(entry = virHashSearch(priv->configCache, xenXMDomainSearchForUUID, (const void *)uuid)))
goto cleanup;
- if (!(ret = virGetDomain(conn, entry->def->name, uuid)))
- goto cleanup;
-
- /* Ensure its marked inactive, because may be cached
- handle to a previously active domain */
- ret->id = -1;
+ ret = virDomainDefNew(entry->def->name, uuid, -1);
cleanup:
xenUnifiedUnlock(priv);
static void
xenXMListIterator(void *payload ATTRIBUTE_UNUSED, const void *name, void *data) {
struct xenXMListIteratorContext *ctx = data;
- virDomainPtr dom = NULL;
+ virDomainDefPtr def = NULL;
if (ctx->oom)
return;
if (ctx->count == ctx->max)
return;
- dom = xenDaemonLookupByName(ctx->conn, name);
- if (!dom) {
+ def = xenDaemonLookupByName(ctx->conn, name);
+ if (!def) {
if (!(ctx->names[ctx->count] = strdup(name)))
ctx->oom = 1;
else
ctx->count++;
} else {
- virDomainFree(dom);
+ virDomainDefFree(def);
}
}
int xenXMDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags);
int xenXMDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
unsigned char *cpumap, int maplen);
-virDomainPtr xenXMDomainLookupByName(virConnectPtr conn, const char *domname);
-virDomainPtr xenXMDomainLookupByUUID(virConnectPtr conn,
- const unsigned char *uuid);
+virDomainDefPtr xenXMDomainLookupByName(virConnectPtr conn, const char *domname);
+virDomainDefPtr xenXMDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid);
int xenXMListDefinedDomains(virConnectPtr conn, char ** const names, int maxnames);
int xenXMNumOfDefinedDomains(virConnectPtr conn);