Make sure that the domains found in xenstore are active when reporting
the number of domains and when reporting which domains that are
active.
---
src/xs_internal.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 46 insertions(+), 7 deletions(-)
diff --git a/src/xs_internal.c b/src/xs_internal.c
index 1f54b1f..5b0ce1e 100644
--- a/src/xs_internal.c
+++ b/src/xs_internal.c
@@ -542,9 +542,10 @@ xenStoreDomainGetMaxMemory(virDomainPtr domain)
int
xenStoreNumOfDomains(virConnectPtr conn)
{
- unsigned int num;
+ unsigned int num, realnum, len;
char **idlist;
- int ret = -1;
+ char *ldpath = NULL, *vmpath = NULL, *vmvalue = NULL;
+ int i, ret = -1;
xenUnifiedPrivatePtr priv;
if (conn == NULL) {
@@ -558,9 +559,29 @@ xenStoreNumOfDomains(virConnectPtr conn)
return(-1);
}
idlist = xs_directory(priv->xshandle, 0, "/local/domain", &num);
+
+ /* Check which of the found domains that are running */
+ realnum = num;
+ for (i = 0; i < num; i++) {
+ if (asprintf(&ldpath, "/local/domain/%s/vm", idlist[i]) < 0) {
+ virReportOOMError(NULL);
+ return -1;
+ }
+ vmpath = xs_read (priv->xshandle, 0, ldpath, &len);
+ if (len > 0)
+ vmvalue = xs_read (priv->xshandle, 0, vmpath, &len);
+
+ if (vmvalue == NULL)
+ realnum--;
+
+ VIR_FREE(ldpath);
+ VIR_FREE(vmpath);
+ VIR_FREE(vmvalue);
+ }
+
if (idlist) {
free(idlist);
- ret = num;
+ ret = realnum;
}
return(ret);
}
@@ -580,7 +601,8 @@ static int
xenStoreDoListDomains(xenUnifiedPrivatePtr priv, int *ids, int maxids)
{
char **idlist = NULL, *endptr;
- unsigned int num, i;
+ char *vmpath = NULL, *vmvalue = NULL, *ldpath = NULL;
+ unsigned int num, i, len;
int ret = -1;
long id;
@@ -592,14 +614,31 @@ xenStoreDoListDomains(xenUnifiedPrivatePtr priv, int *ids, int
maxids)
goto out;
for (ret = 0, i = 0; (i < num) && (ret < maxids); i++) {
- id = strtol(idlist[i], &endptr, 10);
- if ((endptr == idlist[i]) || (*endptr != 0))
+ if (asprintf(&ldpath, "/local/domain/%s/vm", idlist[i]) < 0) {
+ virReportOOMError(NULL);
goto out;
- ids[ret++] = (int) id;
+ }
+ vmpath = xs_read (priv->xshandle, 0, ldpath, &len);
+ if (len > 0)
+ vmvalue = xs_read (priv->xshandle, 0, vmpath, &len);
+
+ if (vmvalue != NULL) {
+ id = strtol(idlist[i], &endptr, 10);
+ if ((endptr == idlist[i]) || (*endptr != 0))
+ goto out;
+ ids[ret++] = (int) id;
+ }
+
+ VIR_FREE (ldpath);
+ VIR_FREE (vmpath);
+ VIR_FREE (vmvalue);
}
out:
VIR_FREE (idlist);
+ VIR_FREE (ldpath);
+ VIR_FREE (vmpath);
+ VIR_FREE (vmvalue);
return ret;
}
--
1.6.2