Devel
Threads by month
- ----- 2026 -----
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- 17 participants
- 40169 discussions
31 Oct '08
In adding a test of the vcpu cpuset parsing code (another patch coming
separately), I noticed a bogus diagnostic:
virsh --connect test:///default dumpxml 1 > xml
sed "s/vcpu>/vcpu cpuset='aaa'>/" xml > xml-invalid
./virsh --connect test:///default define xml-invalid 2>&1 |head -1
libvir: Domain Config error : failed Xen syscall topology cpuset syntax error -2027441560
With the patch below, I get this output instead:
(i.e., same, but without the trailing negative number)
$ ./virsh --connect test:///default define xml-invalid 2>&1 |head -1
libvir: Domain Config error : failed Xen syscall topology cpuset syntax error
diff --git a/src/virterror.c b/src/virterror.c
index 21c7339..be809a0 100644
--- a/src/virterror.c
+++ b/src/virterror.c
@@ -1,7 +1,7 @@
/*
* virterror.c: implements error handling and reporting code for libvirt
*
- * Copy: Copyright (C) 2006 Red Hat, Inc.
+ * Copy: Copyright (C) 2006, 2008 Red Hat, Inc.
*
* See COPYING.LIB for the License of this software
*
@@ -516,7 +516,7 @@ __virErrorMsg(virErrorNumber error, const char *info)
errmsg = _("could not connect to Xen Store %s");
break;
case VIR_ERR_XEN_CALL:
- errmsg = _("failed Xen syscall %s %d");
+ errmsg = _("failed Xen syscall %s");
break;
case VIR_ERR_OS_TYPE:
if (info == NULL)
2
1
Hi,
I am using virt-viewer to view an Windows VM. However, I cannot get
fullscreen with virt-viewer when using menu View -> Fullscreen. When I
did that, nothing happenes. Is that a bug?
The version of virt-viewer is 0.0.3
Thanks,
J
1
0
The attached patch implements the storage driver routines
for the test driver. Most of the code is identical to
storage_driver.c with all the references to backends
removed.
One caveat of this is that storage pools are hardcoded
to a specific size when they are defined: I figure someone
could expand this to read sizes from xml at definition
time if they wanted, but for now hardcoded values is
sufficient.
I've done some decent testing with it all, so I'm pretty
confident it isn't too broken.
Thanks,
Cole
src/test.c | 753 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 748 insertions(+), 5 deletions(-)
diff --git a/src/test.c b/src/test.c
index aab74e4..5ee51c0 100644
--- a/src/test.c
+++ b/src/test.c
@@ -29,6 +29,7 @@
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
+#include <libxml/xmlsave.h>
#include "test.h"
#include "buf.h"
@@ -38,6 +39,7 @@
#include "memory.h"
#include "network_conf.h"
#include "domain_conf.h"
+#include "storage_conf.h"
#include "xml.h"
#define MAX_CPUS 128
@@ -59,6 +61,7 @@ struct _testConn {
virNodeInfo nodeInfo;
virDomainObjList domains;
virNetworkObjList networks;
+ virStoragePoolObjList pools;
int numCells;
testCell cells[MAX_CELLS];
};
@@ -106,11 +109,56 @@ static const virNodeInfo defaultNodeInfo = {
} \
} while (0)
+#define GET_POOL(pool, ret) \
+ testConnPtr privconn; \
+ virStoragePoolObjPtr privpool; \
+ \
+ privconn = (testConnPtr)pool->conn->privateData; \
+ do { \
+ if ((privpool = virStoragePoolObjFindByName(&privconn->pools, \
+ (pool)->name)) == NULL) {\
+ testError((pool)->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); \
+ return (ret); \
+ } \
+ } while (0)
+
+#define GET_POOL_FROM_VOL(vol, ret) \
+ GET_POOL(testStoragePoolLookupByName((virConnectPtr) \
+ vol->conn, \
+ vol->pool), ret)
+
+#define GET_VOL(vol, pool, ret) \
+ virStorageVolDefPtr privvol; \
+ \
+ privvol = virStorageVolDefFindByName(pool, vol->name); \
+ do { \
+ if (!privvol) { \
+ testError(vol->conn, VIR_ERR_INVALID_STORAGE_VOL, \
+ _("no storage vol with matching name '%s'"), \
+ vol->name); \
+ return (ret); \
+ } \
+ } while (0) \
+
+
#define GET_CONNECTION(conn) \
testConnPtr privconn; \
\
privconn = (testConnPtr)conn->privateData;
+#define POOL_IS_ACTIVE(pool, ret) \
+ if (!virStoragePoolObjIsActive(pool)) { \
+ testError(obj->conn, VIR_ERR_INTERNAL_ERROR, \
+ _("storage pool '%s' is not active"), pool->def->name); \
+ return (ret); \
+ } \
+
+#define POOL_IS_NOT_ACTIVE(pool, ret) \
+ if (virStoragePoolObjIsActive(pool)) { \
+ testError(obj->conn, VIR_ERR_INTERNAL_ERROR, \
+ _("storage pool '%s' is already active"), pool->def->name); \
+ return (ret); \
+ } \
#define testError(conn, code, fmt...) \
__virReportErrorHelper(conn, VIR_FROM_TEST, code, __FILE__, \
@@ -196,6 +244,18 @@ static const char *defaultNetworkXML =
" </ip>"
"</network>";
+static const char *defaultPoolXML =
+"<pool type='dir'>"
+" <name>default-pool</name>"
+" <target>"
+" <path>/default-pool</path>"
+" </target>"
+"</pool>";
+
+static const unsigned long long defaultPoolCap = (100 * 1024 * 1024 * 1024ul);
+static const unsigned long long defaultPoolAlloc = 0;
+
+static int testStoragePoolObjSetDefaults(virStoragePoolObjPtr pool);
static int testOpenDefault(virConnectPtr conn) {
int u;
@@ -205,6 +265,8 @@ static int testOpenDefault(virConnectPtr conn) {
virDomainObjPtr domobj = NULL;
virNetworkDefPtr netdef = NULL;
virNetworkObjPtr netobj = NULL;
+ virStoragePoolDefPtr pooldef = NULL;
+ virStoragePoolObjPtr poolobj = NULL;
if (VIR_ALLOC(privconn) < 0) {
testError(conn, VIR_ERR_NO_MEMORY, "testConn");
@@ -250,15 +312,27 @@ static int testOpenDefault(virConnectPtr conn) {
virNetworkDefFree(netdef);
goto error;
}
-
netobj->active = 1;
netobj->persistent = 1;
+ if (!(pooldef = virStoragePoolDefParse(conn, defaultPoolXML, NULL)))
+ goto error;
+
+ if (!(poolobj = virStoragePoolObjAssignDef(conn, &privconn->pools,
+ pooldef))) {
+ virStoragePoolDefFree(pooldef);
+ goto error;
+ }
+ if (testStoragePoolObjSetDefaults(poolobj) == -1)
+ goto error;
+ poolobj->active = 1;
+
return VIR_DRV_OPEN_SUCCESS;
error:
virDomainObjListFree(&privconn->domains);
virNetworkObjListFree(&privconn->networks);
+ virStoragePoolObjListFree(&privconn->pools);
virCapabilitiesFree(privconn->caps);
VIR_FREE(privconn);
return VIR_DRV_OPEN_ERROR;
@@ -295,7 +369,7 @@ static int testOpenFromFile(virConnectPtr conn,
char *str;
xmlDocPtr xml = NULL;
xmlNodePtr root = NULL;
- xmlNodePtr *domains = NULL, *networks = NULL;
+ xmlNodePtr *domains = NULL, *networks = NULL, *pools = NULL;
xmlXPathContextPtr ctxt = NULL;
virNodeInfoPtr nodeInfo;
virNetworkObjPtr net;
@@ -311,7 +385,9 @@ static int testOpenFromFile(virConnectPtr conn,
goto error;
if ((fd = open(file, O_RDONLY)) < 0) {
- testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("loading host definition file"));
+ testError(NULL, VIR_ERR_INTERNAL_ERROR,
+ _("loading host definition file '%s': %s"),
+ file, strerror(errno));
goto error;
}
@@ -332,7 +408,8 @@ static int testOpenFromFile(virConnectPtr conn,
ctxt = xmlXPathNewContext(xml);
if (ctxt == NULL) {
- testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("creating xpath context"));
+ testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("creating xpath context"));
goto error;
}
@@ -480,6 +557,58 @@ static int testOpenFromFile(virConnectPtr conn,
if (networks != NULL)
VIR_FREE(networks);
+ /* Parse Storage Pool list */
+ ret = virXPathNodeSet(conn, "/node/pool", ctxt, &pools);
+ if (ret < 0) {
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node pool list"));
+ goto error;
+ }
+ for (i = 0 ; i < ret ; i++) {
+ virStoragePoolDefPtr def;
+ virStoragePoolObjPtr pool;
+ char *relFile = virXMLPropString(pools[i], "file");
+ if (relFile != NULL) {
+ char *absFile = testBuildFilename(file, relFile);
+ VIR_FREE(relFile);
+ if (!absFile) {
+ testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("resolving pool filename"));
+ goto error;
+ }
+
+ def = virStoragePoolDefParse(conn, NULL, absFile);
+ VIR_FREE(absFile);
+ if (!def)
+ goto error;
+ } else {
+ xmlBufferPtr buf;
+ xmlSaveCtxtPtr sctxt;
+
+ buf = xmlBufferCreate();
+ sctxt = xmlSaveToBuffer(buf, NULL, 0);
+ xmlSaveTree(sctxt, pools[i]);
+ xmlSaveClose(sctxt);
+ if ((def = virStoragePoolDefParse(conn,
+ (const char *) buf->content,
+ NULL)) == NULL) {
+ xmlBufferFree(buf);
+ goto error;
+ }
+ }
+
+ if (!(pool = virStoragePoolObjAssignDef(conn, &privconn->pools,
+ def))) {
+ virStoragePoolDefFree(def);
+ goto error;
+ }
+
+ if (testStoragePoolObjSetDefaults(pool) == -1)
+ goto error;
+ pool->active = 1;
+ }
+ if (pools != NULL)
+ VIR_FREE(pools);
+
xmlXPathFreeContext(ctxt);
xmlFreeDoc(xml);
@@ -490,10 +619,12 @@ static int testOpenFromFile(virConnectPtr conn,
xmlFreeDoc(xml);
VIR_FREE(domains);
VIR_FREE(networks);
+ VIR_FREE(pools);
if (fd != -1)
close(fd);
virDomainObjListFree(&privconn->domains);
virNetworkObjListFree(&privconn->networks);
+ virStoragePoolObjListFree(&privconn->pools);
VIR_FREE(privconn);
conn->privateData = NULL;
return VIR_DRV_OPEN_ERROR;
@@ -545,6 +676,7 @@ static int testClose(virConnectPtr conn)
virCapabilitiesFree(privconn->caps);
virDomainObjListFree(&privconn->domains);
virNetworkObjListFree(&privconn->networks);
+ virStoragePoolObjListFree(&privconn->pools);
VIR_FREE (privconn);
conn->privateData = conn;
@@ -1475,6 +1607,26 @@ static int testNetworkSetAutostart(virNetworkPtr network,
return (0);
}
+
+/*
+ * Storage Driver routines
+ */
+
+static int testStoragePoolObjSetDefaults(virStoragePoolObjPtr pool) {
+
+ pool->def->capacity = defaultPoolCap;
+ pool->def->allocation = defaultPoolAlloc;
+ pool->def->available = defaultPoolCap - defaultPoolAlloc;
+
+ pool->configFile = strdup("\0");
+ if (!pool->configFile) {
+ testError(NULL, VIR_ERR_NO_MEMORY, "configFile");
+ return -1;
+ }
+
+ return 0;
+}
+
static virDrvOpenStatus testStorageOpen(virConnectPtr conn,
xmlURIPtr uri ATTRIBUTE_UNUSED,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
@@ -1491,6 +1643,566 @@ static int testStorageClose(virConnectPtr conn) {
return 0;
}
+static virStoragePoolPtr
+testStoragePoolLookupByUUID(virConnectPtr conn,
+ const unsigned char *uuid) {
+ virStoragePoolObjPtr pool = NULL;
+ GET_CONNECTION(conn);
+
+ if ((pool = virStoragePoolObjFindByUUID(&privconn->pools, uuid)) == NULL) {
+ testError (conn, VIR_ERR_NO_STORAGE_POOL, NULL);
+ return NULL;
+ }
+
+ return virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+}
+
+static virStoragePoolPtr
+testStoragePoolLookupByName(virConnectPtr conn,
+ const char *name) {
+ virStoragePoolObjPtr pool = NULL;
+ GET_CONNECTION(conn);
+
+ if ((pool = virStoragePoolObjFindByName(&privconn->pools, name)) == NULL) {
+ testError (conn, VIR_ERR_NO_STORAGE_POOL, NULL);
+ return NULL;
+ }
+
+ return virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+}
+
+static virStoragePoolPtr
+testStoragePoolLookupByVolume(virStorageVolPtr vol) {
+ return testStoragePoolLookupByName(vol->conn, vol->pool);
+}
+
+static int
+testStorageNumPools(virConnectPtr conn) {
+
+ int numActive = 0, i;
+ GET_CONNECTION(conn);
+
+ for (i = 0 ; i < privconn->pools.count ; i++)
+ if (virStoragePoolObjIsActive(privconn->pools.objs[i]))
+ numActive++;
+
+ return numActive;
+}
+
+static int
+testStorageListPools(virConnectPtr conn,
+ char **const names,
+ int nnames) {
+ int n = 0, i;
+ GET_CONNECTION(conn);
+
+ memset(names, 0, sizeof(*names)*nnames);
+ for (i = 0 ; i < privconn->pools.count && n < nnames ; i++)
+ if (virStoragePoolObjIsActive(privconn->pools.objs[i]) &&
+ !(names[n++] = strdup(privconn->pools.objs[i]->def->name)))
+ goto no_memory;
+
+ return n;
+
+no_memory:
+ testError(conn, VIR_ERR_NO_MEMORY, NULL);
+ for (n = 0 ; n < nnames ; n++)
+ VIR_FREE(names[n]);
+ return (-1);
+}
+
+static int
+testStorageNumDefinedPools(virConnectPtr conn) {
+
+ int numInactive = 0, i;
+ GET_CONNECTION(conn);
+
+ for (i = 0 ; i < privconn->pools.count ; i++)
+ if (!virStoragePoolObjIsActive(privconn->pools.objs[i]))
+ numInactive++;
+
+ return numInactive;
+}
+
+static int
+testStorageListDefinedPools(virConnectPtr conn,
+ char **const names,
+ int nnames) {
+ int n = 0, i;
+ GET_CONNECTION(conn);
+
+ memset(names, 0, sizeof(*names)*nnames);
+ for (i = 0 ; i < privconn->pools.count && n < nnames ; i++)
+ if (!virStoragePoolObjIsActive(privconn->pools.objs[i]) &&
+ !(names[n++] = strdup(privconn->pools.objs[i]->def->name)))
+ goto no_memory;
+
+ return n;
+
+no_memory:
+ testError(conn, VIR_ERR_NO_MEMORY, NULL);
+ for (n = 0 ; n < nnames ; n++)
+ VIR_FREE(names[n]);
+ return (-1);
+}
+
+static int
+testStoragePoolRefresh(virStoragePoolPtr obj,
+ unsigned int flags ATTRIBUTE_UNUSED);
+
+static int
+testStoragePoolStart(virStoragePoolPtr obj,
+ unsigned int flags ATTRIBUTE_UNUSED) {
+ GET_POOL(obj, -1);
+ POOL_IS_NOT_ACTIVE(privpool, -1);
+
+ if (testStoragePoolRefresh(obj, 0) == 0)
+ return -1;
+ privpool->active = 1;
+
+ return 0;
+}
+
+static char *
+testStorageFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSED,
+ const char *type ATTRIBUTE_UNUSED,
+ const char *srcSpec ATTRIBUTE_UNUSED,
+ unsigned int flags ATTRIBUTE_UNUSED)
+{
+ return NULL;
+}
+
+
+static virStoragePoolPtr
+testStoragePoolCreate(virConnectPtr conn,
+ const char *xml,
+ unsigned int flags ATTRIBUTE_UNUSED) {
+ virStoragePoolDefPtr def;
+ virStoragePoolObjPtr pool;
+ GET_CONNECTION(conn);
+
+ if (!(def = virStoragePoolDefParse(conn, xml, NULL)))
+ return NULL;
+
+ if (virStoragePoolObjFindByUUID(&privconn->pools, def->uuid) ||
+ virStoragePoolObjFindByName(&privconn->pools, def->name)) {
+ testError(conn, VIR_ERR_INTERNAL_ERROR,
+ "%s", _("storage pool already exists"));
+ virStoragePoolDefFree(def);
+ return NULL;
+ }
+
+ if (!(pool = virStoragePoolObjAssignDef(conn, &privconn->pools, def))) {
+ virStoragePoolDefFree(def);
+ return NULL;
+ }
+
+ if (testStoragePoolObjSetDefaults(pool) == -1) {
+ virStoragePoolObjRemove(&privconn->pools, pool);
+ return NULL;
+ }
+ pool->active = 1;
+
+ return virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+}
+
+static virStoragePoolPtr
+testStoragePoolDefine(virConnectPtr conn,
+ const char *xml,
+ unsigned int flags ATTRIBUTE_UNUSED) {
+ virStoragePoolDefPtr def;
+ virStoragePoolObjPtr pool;
+ GET_CONNECTION(conn);
+
+ if (!(def = virStoragePoolDefParse(conn, xml, NULL)))
+ return NULL;
+
+ def->capacity = defaultPoolCap;
+ def->allocation = defaultPoolAlloc;
+ def->available = defaultPoolCap - defaultPoolAlloc;
+
+ if (!(pool = virStoragePoolObjAssignDef(conn, &privconn->pools, def))) {
+ virStoragePoolDefFree(def);
+ return NULL;
+ }
+
+ if (testStoragePoolObjSetDefaults(pool) == -1) {
+ virStoragePoolObjRemove(&privconn->pools, pool);
+ return NULL;
+ }
+
+ return virGetStoragePool(conn, pool->def->name, pool->def->uuid);
+}
+
+static int
+testStoragePoolUndefine(virStoragePoolPtr obj) {
+ GET_POOL(obj, -1);
+ POOL_IS_NOT_ACTIVE(privpool, -1);
+
+ virStoragePoolObjRemove(&privconn->pools, privpool);
+
+ return 0;
+}
+
+static int
+testStoragePoolBuild(virStoragePoolPtr obj,
+ unsigned int flags ATTRIBUTE_UNUSED) {
+ GET_POOL(obj, -1);
+ POOL_IS_NOT_ACTIVE(privpool, -1);
+
+ return 0;
+}
+
+
+static int
+testStoragePoolDestroy(virStoragePoolPtr obj) {
+ GET_POOL(obj, -1);
+ POOL_IS_ACTIVE(privpool, -1);
+
+ privpool->active = 0;
+
+ if (privpool->configFile == NULL)
+ virStoragePoolObjRemove(&privconn->pools, privpool);
+
+ return 0;
+}
+
+
+static int
+testStoragePoolDelete(virStoragePoolPtr obj,
+ unsigned int flags ATTRIBUTE_UNUSED) {
+ GET_POOL(obj, -1);
+ POOL_IS_NOT_ACTIVE(privpool, -1);
+
+ return 0;
+}
+
+
+static int
+testStoragePoolRefresh(virStoragePoolPtr obj,
+ unsigned int flags ATTRIBUTE_UNUSED) {
+ GET_POOL(obj, -1);
+ POOL_IS_ACTIVE(privpool, -1);
+
+ return 0;
+}
+
+
+static int
+testStoragePoolGetInfo(virStoragePoolPtr obj,
+ virStoragePoolInfoPtr info) {
+ GET_POOL(obj, -1);
+
+ memset(info, 0, sizeof(virStoragePoolInfo));
+ if (privpool->active)
+ info->state = VIR_STORAGE_POOL_RUNNING;
+ else
+ info->state = VIR_STORAGE_POOL_INACTIVE;
+ info->capacity = privpool->def->capacity;
+ info->allocation = privpool->def->allocation;
+ info->available = privpool->def->available;
+
+ return 0;
+}
+
+static char *
+testStoragePoolDumpXML(virStoragePoolPtr obj,
+ unsigned int flags ATTRIBUTE_UNUSED) {
+ GET_POOL(obj, NULL);
+
+ return virStoragePoolDefFormat(obj->conn, privpool->def);
+}
+
+static int
+testStoragePoolGetAutostart(virStoragePoolPtr obj,
+ int *autostart) {
+ GET_POOL(obj, -1);
+
+ if (!privpool->configFile) {
+ *autostart = 0;
+ } else {
+ *autostart = privpool->autostart;
+ }
+
+ return 0;
+}
+
+static int
+testStoragePoolSetAutostart(virStoragePoolPtr obj,
+ int autostart) {
+ GET_POOL(obj, -1);
+
+ if (!privpool->configFile) {
+ testError(obj->conn, VIR_ERR_INVALID_ARG,
+ "%s", _("pool has no config file"));
+ return -1;
+ }
+
+ autostart = (autostart != 0);
+
+ if (privpool->autostart == autostart)
+ return 0;
+
+ privpool->autostart = autostart;
+ return 0;
+}
+
+
+static int
+testStoragePoolNumVolumes(virStoragePoolPtr obj) {
+ GET_POOL(obj, -1);
+ POOL_IS_ACTIVE(privpool, -1);
+
+ return privpool->volumes.count;
+}
+
+static int
+testStoragePoolListVolumes(virStoragePoolPtr obj,
+ char **const names,
+ int maxnames) {
+ GET_POOL(obj, -1);
+ POOL_IS_ACTIVE(privpool, -1);
+ int i = 0, n = 0;
+
+ memset(names, 0, maxnames);
+ for (i = 0 ; i < privpool->volumes.count && n < maxnames ; i++) {
+ if ((names[n++] = strdup(privpool->volumes.objs[i]->name)) == NULL) {
+ testError(obj->conn, VIR_ERR_NO_MEMORY, "%s", _("name"));
+ goto cleanup;
+ }
+ }
+
+ return n;
+
+ cleanup:
+ for (n = 0 ; n < maxnames ; n++)
+ VIR_FREE(names[i]);
+
+ memset(names, 0, maxnames);
+ return -1;
+}
+
+
+static virStorageVolPtr
+testStorageVolumeLookupByName(virStoragePoolPtr obj,
+ const char *name ATTRIBUTE_UNUSED) {
+ GET_POOL(obj, NULL);
+ POOL_IS_ACTIVE(privpool, NULL);
+ virStorageVolDefPtr vol = virStorageVolDefFindByName(privpool, name);
+
+ if (!vol) {
+ testError(obj->conn, VIR_ERR_INVALID_STORAGE_VOL,
+ _("no storage vol with matching name '%s'"), name);
+ return NULL;
+ }
+
+ return virGetStorageVol(obj->conn, privpool->def->name,
+ vol->name, vol->key);
+}
+
+
+static virStorageVolPtr
+testStorageVolumeLookupByKey(virConnectPtr conn,
+ const char *key) {
+ GET_CONNECTION(conn);
+ unsigned int i;
+
+ for (i = 0 ; i < privconn->pools.count ; i++) {
+ if (virStoragePoolObjIsActive(privconn->pools.objs[i])) {
+ virStorageVolDefPtr vol =
+ virStorageVolDefFindByKey(privconn->pools.objs[i], key);
+
+ if (vol)
+ return virGetStorageVol(conn,
+ privconn->pools.objs[i]->def->name,
+ vol->name,
+ vol->key);
+ }
+ }
+
+ testError(conn, VIR_ERR_INVALID_STORAGE_VOL,
+ _("no storage vol with matching key '%s'"), key);
+ return NULL;
+}
+
+static virStorageVolPtr
+testStorageVolumeLookupByPath(virConnectPtr conn,
+ const char *path) {
+ GET_CONNECTION(conn);
+ unsigned int i;
+
+ for (i = 0 ; i < privconn->pools.count ; i++) {
+ if (virStoragePoolObjIsActive(privconn->pools.objs[i])) {
+ virStorageVolDefPtr vol =
+ virStorageVolDefFindByPath(privconn->pools.objs[i], path);
+
+ if (vol)
+ return virGetStorageVol(conn,
+ privconn->pools.objs[i]->def->name,
+ vol->name,
+ vol->key);
+ }
+ }
+
+ testError(conn, VIR_ERR_INVALID_STORAGE_VOL,
+ _("no storage vol with matching path '%s'"), path);
+ return NULL;
+}
+
+static virStorageVolPtr
+testStorageVolumeCreateXML(virStoragePoolPtr obj,
+ const char *xmldesc,
+ unsigned int flags ATTRIBUTE_UNUSED) {
+ GET_POOL(obj, NULL);
+ POOL_IS_ACTIVE(privpool, NULL);
+ virStorageVolDefPtr vol;
+
+ vol = virStorageVolDefParse(obj->conn, privpool->def, xmldesc, NULL);
+ if (vol == NULL)
+ return NULL;
+
+ if (virStorageVolDefFindByName(privpool, vol->name)) {
+ testError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
+ "%s", _("storage vol already exists"));
+ virStorageVolDefFree(vol);
+ return NULL;
+ }
+
+ /* Make sure enough space */
+ if ((privpool->def->allocation + vol->allocation) >
+ privpool->def->capacity) {
+ testError(obj->conn, VIR_ERR_INTERNAL_ERROR,
+ _("Not enough free space in pool for volume '%s'"),
+ vol->name);
+ virStorageVolDefFree(vol);
+ return NULL;
+ }
+ privpool->def->available = (privpool->def->capacity -
+ privpool->def->allocation);
+
+ if (VIR_REALLOC_N(privpool->volumes.objs,
+ privpool->volumes.count+1) < 0) {
+ testError(obj->conn, VIR_ERR_NO_MEMORY, NULL);
+ virStorageVolDefFree(vol);
+ return NULL;
+ }
+
+ if (VIR_ALLOC_N(vol->target.path, strlen(privpool->def->target.path) +
+ 1 + strlen(vol->name) + 1) < 0) {
+ virStorageVolDefFree(vol);
+ testError(obj->conn, VIR_ERR_NO_MEMORY, "%s", _("target"));
+ return NULL;
+ }
+
+ strcpy(vol->target.path, privpool->def->target.path);
+ strcat(vol->target.path, "/");
+ strcat(vol->target.path, vol->name);
+ vol->key = strdup(vol->target.path);
+ if (vol->key == NULL) {
+ virStorageVolDefFree(vol);
+ testError(obj->conn, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("storage vol key"));
+ return NULL;
+ }
+
+ privpool->def->allocation += vol->allocation;
+ privpool->def->available = (privpool->def->capacity -
+ privpool->def->allocation);
+
+ privpool->volumes.objs[privpool->volumes.count++] = vol;
+
+ return virGetStorageVol(obj->conn, privpool->def->name, vol->name,
+ vol->key);
+}
+
+static int
+testStorageVolumeDelete(virStorageVolPtr obj,
+ unsigned int flags ATTRIBUTE_UNUSED) {
+ GET_POOL_FROM_VOL(obj, -1);
+ POOL_IS_ACTIVE(privpool, -1);
+ GET_VOL(obj, privpool, -1);
+ int i;
+
+ privpool->def->allocation -= privvol->allocation;
+ privpool->def->available = (privpool->def->capacity -
+ privpool->def->allocation);
+
+ for (i = 0 ; i < privpool->volumes.count ; i++) {
+ if (privpool->volumes.objs[i] == privvol) {
+ virStorageVolDefFree(privvol);
+
+ if (i < (privpool->volumes.count - 1))
+ memmove(privpool->volumes.objs + i,
+ privpool->volumes.objs + i + 1,
+ sizeof(*(privpool->volumes.objs)) *
+ (privpool->volumes.count - (i + 1)));
+
+ if (VIR_REALLOC_N(privpool->volumes.objs,
+ privpool->volumes.count - 1) < 0) {
+ ; /* Failure to reduce memory allocation isn't fatal */
+ }
+ privpool->volumes.count--;
+
+ break;
+ }
+ }
+
+ return 0;
+}
+
+
+static int testStorageVolumeTypeForPool(int pooltype) {
+
+ switch(pooltype) {
+ case VIR_STORAGE_POOL_DIR:
+ case VIR_STORAGE_POOL_FS:
+ case VIR_STORAGE_POOL_NETFS:
+ return VIR_STORAGE_VOL_FILE;
+ default:
+ return VIR_STORAGE_VOL_BLOCK;
+ }
+}
+
+static int
+testStorageVolumeGetInfo(virStorageVolPtr obj,
+ virStorageVolInfoPtr info) {
+ GET_POOL_FROM_VOL(obj, -1);
+ POOL_IS_ACTIVE(privpool, -1);
+ GET_VOL(obj, privpool, -1);
+
+ memset(info, 0, sizeof(*info));
+ info->type = testStorageVolumeTypeForPool(privpool->def->type);
+ info->capacity = privvol->capacity;
+ info->allocation = privvol->allocation;
+
+ return 0;
+}
+
+static char *
+testStorageVolumeGetXMLDesc(virStorageVolPtr obj,
+ unsigned int flags ATTRIBUTE_UNUSED) {
+ GET_POOL_FROM_VOL(obj, NULL);
+ POOL_IS_ACTIVE(privpool, NULL);
+ GET_VOL(obj, privpool, NULL);
+
+ return virStorageVolDefFormat(obj->conn, privpool->def, privvol);
+}
+
+static char *
+testStorageVolumeGetPath(virStorageVolPtr obj) {
+ GET_POOL_FROM_VOL(obj, NULL);
+ POOL_IS_ACTIVE(privpool, NULL);
+ GET_VOL(obj, privpool, NULL);
+ char *ret;
+
+ ret = strdup(privvol->target.path);
+ if (ret == NULL) {
+ testError(obj->conn, VIR_ERR_NO_MEMORY, "%s", _("path"));
+ return NULL;
+ }
+ return ret;
+}
+
static virDriver testDriver = {
VIR_DRV_TEST,
@@ -1575,11 +2287,42 @@ static virNetworkDriver testNetworkDriver = {
testNetworkSetAutostart, /* networkSetAutostart */
};
-
static virStorageDriver testStorageDriver = {
.name = "Test",
.open = testStorageOpen,
.close = testStorageClose,
+
+ .numOfPools = testStorageNumPools,
+ .listPools = testStorageListPools,
+ .numOfDefinedPools = testStorageNumDefinedPools,
+ .listDefinedPools = testStorageListDefinedPools,
+ .findPoolSources = testStorageFindPoolSources,
+ .poolLookupByName = testStoragePoolLookupByName,
+ .poolLookupByUUID = testStoragePoolLookupByUUID,
+ .poolLookupByVolume = testStoragePoolLookupByVolume,
+ .poolCreateXML = testStoragePoolCreate,
+ .poolDefineXML = testStoragePoolDefine,
+ .poolBuild = testStoragePoolBuild,
+ .poolUndefine = testStoragePoolUndefine,
+ .poolCreate = testStoragePoolStart,
+ .poolDestroy = testStoragePoolDestroy,
+ .poolDelete = testStoragePoolDelete,
+ .poolRefresh = testStoragePoolRefresh,
+ .poolGetInfo = testStoragePoolGetInfo,
+ .poolGetXMLDesc = testStoragePoolDumpXML,
+ .poolGetAutostart = testStoragePoolGetAutostart,
+ .poolSetAutostart = testStoragePoolSetAutostart,
+ .poolNumOfVolumes = testStoragePoolNumVolumes,
+ .poolListVolumes = testStoragePoolListVolumes,
+
+ .volLookupByName = testStorageVolumeLookupByName,
+ .volLookupByKey = testStorageVolumeLookupByKey,
+ .volLookupByPath = testStorageVolumeLookupByPath,
+ .volCreateXML = testStorageVolumeCreateXML,
+ .volDelete = testStorageVolumeDelete,
+ .volGetInfo = testStorageVolumeGetInfo,
+ .volGetXMLDesc = testStorageVolumeGetXMLDesc,
+ .volGetPath = testStorageVolumeGetPath,
};
/**
3
4
Attached are the python bindings for domain events
I have moved much of the complicated code from my prior submission out of C and into python.
This required a slight change to the generator.
The new convention that we came up with is to append <classname>.py to the class as it is being generated, iff that file exists.
examples/domain-events/events-python/event-test.py | 186 +++++++++
python/generator.py | 16
python/libvir.c | 410 +++++++++++++++++++++
python/libvir.py | 20 +
python/libvirt_wrap.h | 27 +
python/types.c | 47 ++
python/virConnect.py | 46 ++
7 files changed, 747 insertions(+), 5 deletions(-)
2
3
I applied this small patch to add a link to the new bindings pages
under http://libvirt.org/qpid/
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
1
0
This patch moves the definition for virRaiseError/virReportError out of
the internal.h file, and into a newly created virterror.h file, to match
naming of the virterror.c file where the implementation lives. Most
code has to be updated to include virterror.h. This patch also drops the
leading __ prefix on these two functions - it was pointless, since we never
export it from the .so, not even for libvirtd use.
The motivation for this change is to get clarity over our modularization.
Every file in our source tree ultimately includes internal.h, but not
everything is linking to the virterror.c file which includes the impl of
virRaiseError. So it is good to avoid defining functions in header files
which aren't available to those including the header.
I've got a couple more patches of this type to following, so ultimately
internal.h will just contain a bunch of common / useful macros and the
include of the public libvirt.h file.
The diffstat is large, but its mostly line noise - there's no functional
change in this patch.
b/src/virterror.h | 56 +++++++++++++++++++++++++++++++++
src/conf.c | 8 ++--
src/domain_conf.c | 5 +--
src/hash.c | 17 +++++-----
src/internal.h | 24 --------------
src/libvirt.c | 44 +++++++++++++-------------
src/lxc_conf.c | 1
src/lxc_conf.h | 2 -
src/lxc_container.c | 1
src/lxc_controller.c | 2 -
src/lxc_driver.c | 2 -
src/network_conf.c | 5 +--
src/network_driver.c | 3 +
src/nodeinfo.c | 16 ++++-----
src/openvz_conf.c | 1
src/openvz_conf.h | 2 -
src/openvz_driver.c | 2 -
src/proxy_internal.c | 5 +--
src/qemu_conf.c | 1
src/qemu_conf.h | 2 -
src/qemu_driver.c | 1
src/qparams.c | 3 +
src/remote_internal.c | 70 +++++++++++++++++++++---------------------
src/sexpr.c | 4 +-
src/stats_linux.c | 6 +--
src/storage_backend.c | 2 -
src/storage_backend_disk.c | 2 -
src/storage_backend_fs.c | 2 -
src/storage_backend_iscsi.c | 2 -
src/storage_backend_logical.c | 2 -
src/storage_conf.c | 2 -
src/storage_conf.h | 2 -
src/storage_driver.c | 2 -
src/test.c | 4 +-
src/util.c | 4 +-
src/virterror.c | 57 ++++++++++++++++------------------
src/xen_internal.c | 25 +++++++--------
src/xen_unified.c | 4 +-
src/xend_internal.c | 3 +
src/xm_internal.c | 3 +
src/xml.c | 5 +--
src/xmlrpc.c | 6 +--
src/xs_internal.c | 4 +-
43 files changed, 228 insertions(+), 186 deletions(-)
Daniel
diff -r a1dc6ccb7f50 src/conf.c
--- a/src/conf.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/conf.c Wed Oct 29 11:36:21 2008 +0000
@@ -18,7 +18,7 @@
#include <sys/stat.h>
#include <fcntl.h>
-#include "internal.h"
+#include "virterror.h"
#include "buf.h"
#include "conf.h"
#include "util.h"
@@ -96,13 +96,13 @@
/* Construct the string 'filename:line: info' if we have that. */
if (ctxt && ctxt->filename) {
- __virRaiseError(NULL, NULL, NULL, VIR_FROM_CONF, error, VIR_ERR_ERROR,
+ virRaiseError(NULL, NULL, NULL, VIR_FROM_CONF, error, VIR_ERR_ERROR,
info, ctxt->filename, NULL,
ctxt->line, 0,
"%s:%d: %s", ctxt->filename, ctxt->line, info);
} else {
- format = __virErrorMsg(error, info);
- __virRaiseError(NULL, NULL, NULL, VIR_FROM_CONF, error, VIR_ERR_ERROR,
+ format = virErrorMsg(error, info);
+ virRaiseError(NULL, NULL, NULL, VIR_FROM_CONF, error, VIR_ERR_ERROR,
info, NULL, NULL,
ctxt ? ctxt->line : 0, 0,
format, info);
diff -r a1dc6ccb7f50 src/domain_conf.c
--- a/src/domain_conf.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/domain_conf.c Wed Oct 29 11:36:21 2008 +0000
@@ -29,8 +29,7 @@
#include <fcntl.h>
#include <dirent.h>
-#include "internal.h"
-
+#include "virterror.h"
#include "domain_conf.h"
#include "memory.h"
#include "verify.h"
@@ -142,7 +141,7 @@
"pci")
#define virDomainReportError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_DOMAIN, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_DOMAIN, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
virDomainObjPtr virDomainFindByID(const virDomainObjListPtr doms,
diff -r a1dc6ccb7f50 src/hash.c
--- a/src/hash.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/hash.c Wed Oct 29 11:36:21 2008 +0000
@@ -23,7 +23,8 @@
#include <string.h>
#include <stdlib.h>
#include <libxml/threads.h>
-#include "internal.h"
+
+#include "virterror.h"
#include "hash.h"
#include "memory.h"
@@ -32,7 +33,7 @@
/* #define DEBUG_GROW */
#define virHashError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_NONE, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_NONE, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
/*
@@ -732,8 +733,8 @@
virHashFree(conn->storageVols, (virHashDeallocator) virStorageVolFreeName);
virResetError(&conn->err);
- if (__lastErr.conn == conn)
- __lastErr.conn = NULL;
+ if (virLastErr.conn == conn)
+ virLastErr.conn = NULL;
VIR_FREE(conn->name);
@@ -862,8 +863,8 @@
if (conn->err.dom == domain)
conn->err.dom = NULL;
- if (__lastErr.dom == domain)
- __lastErr.dom = NULL;
+ if (virLastErr.dom == domain)
+ virLastErr.dom = NULL;
domain->magic = -1;
domain->id = -1;
VIR_FREE(domain->name);
@@ -998,8 +999,8 @@
if (conn->err.net == network)
conn->err.net = NULL;
- if (__lastErr.net == network)
- __lastErr.net = NULL;
+ if (virLastErr.net == network)
+ virLastErr.net = NULL;
network->magic = -1;
VIR_FREE(network->name);
diff -r a1dc6ccb7f50 src/internal.h
--- a/src/internal.h Wed Oct 29 11:29:16 2008 +0000
+++ b/src/internal.h Wed Oct 29 11:36:21 2008 +0000
@@ -295,30 +295,6 @@
};
-/************************************************************************
- * *
- * API for error handling *
- * *
- ************************************************************************/
-extern virError __lastErr;
-void __virRaiseError(virConnectPtr conn,
- virDomainPtr dom,
- virNetworkPtr net,
- int domain,
- int code,
- virErrorLevel level,
- const char *str1,
- const char *str2,
- const char *str3,
- int int1, int int2, const char *msg, ...)
- ATTRIBUTE_FORMAT(printf, 12, 13);
-const char *__virErrorMsg(virErrorNumber error, const char *info);
-void __virReportErrorHelper(virConnectPtr conn, int domcode, int errcode,
- const char *filename ATTRIBUTE_UNUSED,
- const char *funcname ATTRIBUTE_UNUSED,
- long long linenr ATTRIBUTE_UNUSED,
- const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf, 7, 8);
/************************************************************************
* *
diff -r a1dc6ccb7f50 src/libvirt.c
--- a/src/libvirt.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/libvirt.c Wed Oct 29 11:36:21 2008 +0000
@@ -31,7 +31,7 @@
#include <winsock2.h>
#endif
-#include "internal.h"
+#include "virterror.h"
#include "driver.h"
#include "uuid.h"
@@ -325,9 +325,9 @@
if (error == VIR_ERR_OK)
return;
- errmsg = __virErrorMsg(error, info);
- __virRaiseError(conn, NULL, NULL, VIR_FROM_NONE, error, VIR_ERR_ERROR,
- errmsg, info, NULL, 0, 0, errmsg, info);
+ errmsg = virErrorMsg(error, info);
+ virRaiseError(conn, NULL, NULL, VIR_FROM_NONE, error, VIR_ERR_ERROR,
+ errmsg, info, NULL, 0, 0, errmsg, info);
}
/**
@@ -346,9 +346,9 @@
if (error == VIR_ERR_OK)
return;
- errmsg = __virErrorMsg(error, info);
- __virRaiseError(conn, NULL, NULL, VIR_FROM_NONE, error, VIR_ERR_WARNING,
- errmsg, info, NULL, 0, 0, errmsg, info);
+ errmsg = virErrorMsg(error, info);
+ virRaiseError(conn, NULL, NULL, VIR_FROM_NONE, error, VIR_ERR_WARNING,
+ errmsg, info, NULL, 0, 0, errmsg, info);
}
/**
@@ -369,12 +369,12 @@
if (error == VIR_ERR_OK)
return;
- errmsg = __virErrorMsg(error, info);
+ errmsg = virErrorMsg(error, info);
if (error != VIR_ERR_INVALID_DOMAIN) {
conn = domain->conn;
}
- __virRaiseError(conn, domain, NULL, VIR_FROM_DOM, error, VIR_ERR_ERROR,
- errmsg, info, NULL, 0, 0, errmsg, info);
+ virRaiseError(conn, domain, NULL, VIR_FROM_DOM, error, VIR_ERR_ERROR,
+ errmsg, info, NULL, 0, 0, errmsg, info);
}
/**
@@ -395,12 +395,12 @@
if (error == VIR_ERR_OK)
return;
- errmsg = __virErrorMsg(error, info);
+ errmsg = virErrorMsg(error, info);
if (error != VIR_ERR_INVALID_NETWORK) {
conn = network->conn;
}
- __virRaiseError(conn, NULL, network, VIR_FROM_NET, error, VIR_ERR_ERROR,
- errmsg, info, NULL, 0, 0, errmsg, info);
+ virRaiseError(conn, NULL, network, VIR_FROM_NET, error, VIR_ERR_ERROR,
+ errmsg, info, NULL, 0, 0, errmsg, info);
}
/**
@@ -421,12 +421,12 @@
if (error == VIR_ERR_OK)
return;
- errmsg = __virErrorMsg(error, info);
+ errmsg = virErrorMsg(error, info);
if (error != VIR_ERR_INVALID_STORAGE_POOL)
conn = pool->conn;
- __virRaiseError(conn, NULL, NULL, VIR_FROM_STORAGE, error, VIR_ERR_ERROR,
- errmsg, info, NULL, 0, 0, errmsg, info);
+ virRaiseError(conn, NULL, NULL, VIR_FROM_STORAGE, error, VIR_ERR_ERROR,
+ errmsg, info, NULL, 0, 0, errmsg, info);
}
/**
@@ -447,12 +447,12 @@
if (error == VIR_ERR_OK)
return;
- errmsg = __virErrorMsg(error, info);
+ errmsg = virErrorMsg(error, info);
if (error != VIR_ERR_INVALID_STORAGE_VOL)
conn = vol->conn;
- __virRaiseError(conn, NULL, NULL, VIR_FROM_STORAGE, error, VIR_ERR_ERROR,
- errmsg, info, NULL, 0, 0, errmsg, info);
+ virRaiseError(conn, NULL, NULL, VIR_FROM_STORAGE, error, VIR_ERR_ERROR,
+ errmsg, info, NULL, 0, 0, errmsg, info);
}
/**
@@ -855,13 +855,13 @@
/* If no global error was set, copy any error set
in the connection object we're about to dispose of */
- if (__lastErr.code == VIR_ERR_OK) {
- memcpy(&__lastErr, &ret->err, sizeof(ret->err));
+ if (virLastErr.code == VIR_ERR_OK) {
+ memcpy(&virLastErr, &ret->err, sizeof(ret->err));
memset(&ret->err, 0, sizeof(ret->err));
}
/* Still no error set, then raise a generic error */
- if (__lastErr.code == VIR_ERR_OK)
+ if (virLastErr.code == VIR_ERR_OK)
virLibConnError (NULL, VIR_ERR_INTERNAL_ERROR,
_("unable to open connection"));
diff -r a1dc6ccb7f50 src/lxc_conf.c
--- a/src/lxc_conf.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/lxc_conf.c Wed Oct 29 11:36:21 2008 +0000
@@ -27,6 +27,7 @@
#include <sys/utsname.h>
+#include "virterror.h"
#include "lxc_conf.h"
/* Functions */
diff -r a1dc6ccb7f50 src/lxc_conf.h
--- a/src/lxc_conf.h Wed Oct 29 11:29:16 2008 +0000
+++ b/src/lxc_conf.h Wed Oct 29 11:36:21 2008 +0000
@@ -50,7 +50,7 @@
virCapsPtr lxcCapsInit(void);
#define lxcError(conn, dom, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_LXC, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_LXC, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
#endif /* LXC_CONF_H */
diff -r a1dc6ccb7f50 src/lxc_container.c
--- a/src/lxc_container.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/lxc_container.c Wed Oct 29 11:36:21 2008 +0000
@@ -41,6 +41,7 @@
/* For MS_MOVE */
#include <linux/fs.h>
+#include "virterror.h"
#include "lxc_container.h"
#include "util.h"
#include "memory.h"
diff -r a1dc6ccb7f50 src/lxc_controller.c
--- a/src/lxc_controller.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/lxc_controller.c Wed Oct 29 11:36:21 2008 +0000
@@ -34,7 +34,7 @@
#include <signal.h>
#include <getopt.h>
-#include "internal.h"
+#include "virterror.h"
#include "util.h"
#include "lxc_conf.h"
diff -r a1dc6ccb7f50 src/lxc_driver.c
--- a/src/lxc_driver.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/lxc_driver.c Wed Oct 29 11:36:21 2008 +0000
@@ -35,7 +35,7 @@
#include <unistd.h>
#include <wait.h>
-#include "internal.h"
+#include "virterror.h"
#include "lxc_conf.h"
#include "lxc_container.h"
#include "lxc_driver.h"
diff -r a1dc6ccb7f50 src/network_conf.c
--- a/src/network_conf.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/network_conf.c Wed Oct 29 11:36:21 2008 +0000
@@ -33,8 +33,7 @@
#include <string.h>
#include <dirent.h>
-#include "internal.h"
-
+#include "virterror.h"
#include "network_conf.h"
#include "memory.h"
#include "xml.h"
@@ -50,7 +49,7 @@
"none", "nat", "route" )
#define virNetworkReportError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_NETWORK, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_NETWORK, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets,
diff -r a1dc6ccb7f50 src/network_driver.c
--- a/src/network_driver.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/network_driver.c Wed Oct 29 11:36:21 2008 +0000
@@ -44,6 +44,7 @@
#include <sys/wait.h>
#include <sys/ioctl.h>
+#include "virterror.h"
#include "network_driver.h"
#include "network_conf.h"
#include "driver.h"
@@ -73,7 +74,7 @@
#define networkLog(level, msg...) fprintf(stderr, msg)
#define networkReportError(conn, dom, net, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_QEMU, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_QEMU, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
diff -r a1dc6ccb7f50 src/nodeinfo.c
--- a/src/nodeinfo.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/nodeinfo.c Wed Oct 29 11:36:21 2008 +0000
@@ -33,7 +33,7 @@
#include <sys/utsname.h>
#endif
-#include "internal.h"
+#include "virterror.h"
#include "nodeinfo.h"
#include "physmem.h"
#include "util.h"
@@ -63,7 +63,7 @@
while (*buf && c_isspace(*buf))
buf++;
if (*buf != ':') {
- __virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
+ virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
"parsing cpuinfo processor");
return -1;
@@ -76,7 +76,7 @@
while (*buf && c_isspace(*buf))
buf++;
if (*buf != ':' || !buf[1]) {
- __virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
+ virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
"parsing cpuinfo cpu MHz");
return -1;
@@ -92,7 +92,7 @@
while (*buf && c_isspace(*buf))
buf++;
if (*buf != ':' || !buf[1]) {
- __virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
+ virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
"parsing cpuinfo cpu cores %c", *buf);
return -1;
@@ -105,7 +105,7 @@
}
if (!nodeinfo->cpus) {
- __virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
+ virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
"no cpus found");
return -1;
@@ -129,7 +129,7 @@
struct utsname info;
if (uname(&info) < 0) {
- __virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
+ virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
"cannot extract machine type %s", strerror(errno));
return -1;
@@ -148,7 +148,7 @@
int ret;
FILE *cpuinfo = fopen(CPUINFO_PATH, "r");
if (!cpuinfo) {
- __virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
+ virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
"cannot open %s %s", CPUINFO_PATH, strerror(errno));
return -1;
@@ -165,7 +165,7 @@
}
#else
/* XXX Solaris will need an impl later if they port QEMU driver */
- __virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
+ virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR,
VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
"%s:%s not implemented on this platform\n", __FILE__, __FUNCTION__);
return -1;
diff -r a1dc6ccb7f50 src/openvz_conf.c
--- a/src/openvz_conf.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/openvz_conf.c Wed Oct 29 11:36:21 2008 +0000
@@ -43,6 +43,7 @@
#include <sys/utsname.h>
#include <sys/wait.h>
+#include "virterror.h"
#include "openvz_conf.h"
#include "uuid.h"
#include "buf.h"
diff -r a1dc6ccb7f50 src/openvz_conf.h
--- a/src/openvz_conf.h Wed Oct 29 11:29:16 2008 +0000
+++ b/src/openvz_conf.h Wed Oct 29 11:36:21 2008 +0000
@@ -42,7 +42,7 @@
fprintf(stderr, "\n"); }
#define openvzError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_OPENVZ, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_OPENVZ, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
diff -r a1dc6ccb7f50 src/openvz_driver.c
--- a/src/openvz_driver.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/openvz_driver.c Wed Oct 29 11:36:21 2008 +0000
@@ -47,7 +47,7 @@
#include <stdio.h>
#include <sys/wait.h>
-#include "internal.h"
+#include "virterror.h"
#include "openvz_driver.h"
#include "event.h"
#include "buf.h"
diff -r a1dc6ccb7f50 src/proxy_internal.c
--- a/src/proxy_internal.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/proxy_internal.c Wed Oct 29 11:36:21 2008 +0000
@@ -21,7 +21,8 @@
#include <sys/un.h>
#include <sys/wait.h>
#include <string.h>
-#include "internal.h"
+
+#include "virterror.h"
#include "driver.h"
#include "proxy_internal.h"
#include "util.h"
@@ -93,7 +94,7 @@
************************************************************************/
#define virProxyError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_PROXY, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_PROXY, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
/************************************************************************
diff -r a1dc6ccb7f50 src/qemu_conf.c
--- a/src/qemu_conf.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/qemu_conf.c Wed Oct 29 11:36:21 2008 +0000
@@ -40,6 +40,7 @@
#include <numa.h>
#endif
+#include "virterror.h"
#include "qemu_conf.h"
#include "uuid.h"
#include "buf.h"
diff -r a1dc6ccb7f50 src/qemu_conf.h
--- a/src/qemu_conf.h Wed Oct 29 11:29:16 2008 +0000
+++ b/src/qemu_conf.h Wed Oct 29 11:36:21 2008 +0000
@@ -70,7 +70,7 @@
#define qemudReportError(conn, dom, net, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_QEMU, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_QEMU, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
diff -r a1dc6ccb7f50 src/qemu_driver.c
--- a/src/qemu_driver.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/qemu_driver.c Wed Oct 29 11:36:21 2008 +0000
@@ -52,6 +52,7 @@
#include <sched.h>
#endif
+#include "virterror.h"
#include "qemu_driver.h"
#include "qemu_conf.h"
#include "c-ctype.h"
diff -r a1dc6ccb7f50 src/qparams.c
--- a/src/qparams.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/qparams.c Wed Oct 29 11:36:21 2008 +0000
@@ -26,12 +26,13 @@
#include <stdlib.h>
#include <stdarg.h>
+#include "virterror.h"
#include "buf.h"
#include "memory.h"
#include "qparams.h"
#define qparam_report_oom(void) \
- __virReportErrorHelper(NULL, VIR_FROM_NONE, VIR_ERR_NO_MEMORY, \
+ virReportErrorHelper(NULL, VIR_FROM_NONE, VIR_ERR_NO_MEMORY, \
__FILE__, __FUNCTION__, __LINE__, NULL)
struct qparam_set *
diff -r a1dc6ccb7f50 src/remote_internal.c
--- a/src/remote_internal.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/remote_internal.c Wed Oct 29 11:36:21 2008 +0000
@@ -73,7 +73,7 @@
# define AI_ADDRCONFIG 0
#endif
-#include "internal.h"
+#include "virterror.h"
#include "driver.h"
#include "buf.h"
#include "qparams.h"
@@ -3675,7 +3675,7 @@
} else if (STRCASEEQ(authtype, "polkit")) {
want = REMOTE_AUTH_POLKIT;
} else {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR,
NULL, NULL, NULL, 0, 0,
_("unknown authentication type %s"), authtype);
@@ -3686,7 +3686,7 @@
type = want;
}
if (type == REMOTE_AUTH_NONE) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("requested authentication type %s rejected"),
authtype);
@@ -3726,7 +3726,7 @@
break;
default:
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR,
NULL, NULL, NULL, 0, 0,
_("unsupported authentication type %d"),
@@ -3756,7 +3756,7 @@
host, sizeof(host),
port, sizeof(port),
NI_NUMERICHOST | NI_NUMERICSERV)) != 0) {
- __virRaiseError (NULL, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (NULL, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_NO_MEMORY, VIR_ERR_ERROR,
NULL, NULL, NULL, 0, 0,
_("Cannot resolve address %d: %s"),
@@ -3765,7 +3765,7 @@
}
if (VIR_ALLOC_N(addr, strlen(host) + 1 + strlen(port) + 1) < 0) {
- __virRaiseError (NULL, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (NULL, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_NO_MEMORY, VIR_ERR_ERROR,
NULL, NULL, NULL, 0, 0,
"address");
@@ -3975,7 +3975,7 @@
/* Sets up the SASL library as a whole */
err = sasl_client_init(NULL);
if (err != SASL_OK) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("failed to initialize SASL library: %d (%s)"),
err, sasl_errstring(err, NULL, NULL));
@@ -3985,7 +3985,7 @@
/* Get local address in form IPADDR:PORT */
salen = sizeof(sa);
if (getsockname(priv->sock, (struct sockaddr*)&sa, &salen) < 0) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("failed to get sock address %d (%s)"),
errno, strerror(errno));
@@ -3997,7 +3997,7 @@
/* Get remote address in form IPADDR:PORT */
salen = sizeof(sa);
if (getpeername(priv->sock, (struct sockaddr*)&sa, &salen) < 0) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("failed to get peer address %d (%s)"),
errno, strerror(errno));
@@ -4023,7 +4023,7 @@
&saslconn);
if (err != SASL_OK) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("Failed to create SASL client context: %d (%s)"),
err, sasl_errstring(err, NULL, NULL));
@@ -4036,7 +4036,7 @@
cipher = gnutls_cipher_get(priv->session);
if (!(ssf = (sasl_ssf_t)gnutls_cipher_get_key_size(cipher))) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_INTERNAL_ERROR, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
"%s", _("invalid cipher size for TLS session"));
goto cleanup;
@@ -4046,7 +4046,7 @@
DEBUG("Setting external SSF %d", ssf);
err = sasl_setprop(saslconn, SASL_SSF_EXTERNAL, &ssf);
if (err != SASL_OK) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_INTERNAL_ERROR, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("cannot set external SSF %d (%s)"),
err, sasl_errstring(err, NULL, NULL));
@@ -4065,7 +4065,7 @@
err = sasl_setprop(saslconn, SASL_SEC_PROPS, &secprops);
if (err != SASL_OK) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_INTERNAL_ERROR, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("cannot set security props %d (%s)"),
err, sasl_errstring(err, NULL, NULL));
@@ -4083,7 +4083,7 @@
mechlist = iret.mechlist;
if (wantmech) {
if (strstr(mechlist, wantmech) == NULL) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR,
NULL, NULL, NULL, 0, 0,
_("SASL mechanism %s not supported by server"),
@@ -4103,7 +4103,7 @@
&clientoutlen,
&mech);
if (err != SASL_OK && err != SASL_CONTINUE && err != SASL_INTERACT) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("Failed to start SASL negotiation: %d (%s)"),
err, sasl_errdetail(saslconn));
@@ -4120,7 +4120,7 @@
}
if ((ncred =
remoteAuthMakeCredentials(interact, &cred)) < 0) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR,
NULL, NULL, NULL, 0, 0,
"%s", _("Failed to make auth credentials"));
@@ -4137,7 +4137,7 @@
} else {
msg = "No authentication callback available";
}
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL,
0, 0, "%s", msg);
goto cleanup;
@@ -4145,7 +4145,7 @@
VIR_FREE(iret.mechlist);
if (clientoutlen > REMOTE_AUTH_SASL_DATA_MAX) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("SASL negotiation data too long: %d bytes"),
clientoutlen);
@@ -4185,7 +4185,7 @@
&clientout,
&clientoutlen);
if (err != SASL_OK && err != SASL_CONTINUE && err != SASL_INTERACT) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("Failed SASL step: %d (%s)"),
err, sasl_errdetail(saslconn));
@@ -4199,7 +4199,7 @@
cred = NULL;
}
if ((ncred = remoteAuthMakeCredentials(interact, &cred)) < 0) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
"%s", _("Failed to make auth credentials"));
goto cleanup;
@@ -4214,7 +4214,7 @@
} else {
msg = "No authentication callback available";
}
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL,
0, 0, "%s", msg);
goto cleanup;
@@ -4262,7 +4262,7 @@
if (!priv->uses_tls) {
err = sasl_getprop(saslconn, SASL_SSF, &val);
if (err != SASL_OK) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("cannot query SASL ssf on connection %d (%s)"),
err, sasl_errstring(err, NULL, NULL));
@@ -4271,7 +4271,7 @@
ssf = *(const int *)val;
DEBUG("SASL SSF value %d", ssf);
if (ssf < 56) { /* 56 == DES level, good for Kerberos */
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("negotiation SSF %d was not strong enough"), ssf);
goto cleanup;
@@ -4325,7 +4325,7 @@
if (allowcb) {
/* Run the authentication callback */
if ((*(auth->cb))(&cred, 1, auth->cbdata) < 0) {
- __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
"%s", _("Failed to collect auth credentials"));
return -1;
@@ -4509,7 +4509,7 @@
/* Check program, version, etc. are what we expect. */
if (hdr.prog != REMOTE_PROGRAM) {
- __virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn,
+ virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn,
NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_RPC, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("unknown program (received %x, expected %x)"),
@@ -4517,7 +4517,7 @@
return -1;
}
if (hdr.vers != REMOTE_PROTOCOL_VERSION) {
- __virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn,
+ virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn,
NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_RPC, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("unknown protocol version (received %x, expected %x)"),
@@ -4540,7 +4540,7 @@
goto retry_read;
}
if (hdr.proc != proc_nr) {
- __virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn,
+ virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn,
NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_RPC, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("unknown procedure (received %x, expected %x)"),
@@ -4548,7 +4548,7 @@
return -1;
}
if (hdr.direction != REMOTE_REPLY) {
- __virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn,
+ virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn,
NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_RPC, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("unknown direction (received %x, expected %x)"),
@@ -4556,7 +4556,7 @@
return -1;
}
if (hdr.serial != serial) {
- __virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_RPC, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("unknown serial (received %x, expected %x)"),
hdr.serial, serial);
@@ -4599,7 +4599,7 @@
return -1;
default:
- __virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
+ virRaiseError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_RPC, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
_("unknown status (received %x)"),
hdr.status);
@@ -4809,8 +4809,8 @@
{
const char *errmsg;
- errmsg = __virErrorMsg (code, info);
- __virRaiseError (conn, NULL, NULL, VIR_FROM_REMOTE,
+ errmsg = virErrorMsg (code, info);
+ virRaiseError (conn, NULL, NULL, VIR_FROM_REMOTE,
code, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0,
errmsg, info);
}
@@ -4832,8 +4832,8 @@
errorMessage[0] = '\0';
}
- errmsg = __virErrorMsg (code, errorMessage);
- __virRaiseError (conn, NULL, NULL, VIR_FROM_REMOTE,
+ errmsg = virErrorMsg (code, errorMessage);
+ virRaiseError (conn, NULL, NULL, VIR_FROM_REMOTE,
code, VIR_ERR_ERROR,
errmsg, errorMessage, NULL, -1, -1,
errmsg, errorMessage);
@@ -4850,7 +4850,7 @@
dom = err->dom ? get_nonnull_domain (conn, *err->dom) : NULL;
net = err->net ? get_nonnull_network (conn, *err->net) : NULL;
- __virRaiseError (conn, dom, net,
+ virRaiseError (conn, dom, net,
err->domain, err->code, err->level,
err->str1 ? *err->str1 : NULL,
err->str2 ? *err->str2 : NULL,
diff -r a1dc6ccb7f50 src/sexpr.c
--- a/src/sexpr.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/sexpr.c Wed Oct 29 11:36:21 2008 +0000
@@ -18,13 +18,13 @@
#include "c-ctype.h"
#include <errno.h>
-#include "internal.h"
+#include "virterror.h"
#include "sexpr.h"
#include "util.h"
#include "memory.h"
#define virSexprError(code, fmt...) \
- __virReportErrorHelper(NULL, VIR_FROM_SEXPR, code, __FILE__, \
+ virReportErrorHelper(NULL, VIR_FROM_SEXPR, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
/**
diff -r a1dc6ccb7f50 src/stats_linux.c
--- a/src/stats_linux.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/stats_linux.c Wed Oct 29 11:36:21 2008 +0000
@@ -24,7 +24,7 @@
#include <xs.h>
#endif
-#include "internal.h"
+#include "virterror.h"
#include "util.h"
#include "xen_unified.h"
#include "stats_linux.h"
@@ -48,13 +48,13 @@
char fullinfo[1000];
const char *errmsg;
- errmsg = __virErrorMsg(error, info);
+ errmsg = virErrorMsg(error, info);
if (func != NULL) {
snprintf(fullinfo, sizeof (fullinfo) - 1, "%s: %s", func, info);
fullinfo[sizeof (fullinfo) - 1] = 0;
info = fullinfo;
}
- __virRaiseError(conn, NULL, NULL, VIR_FROM_STATS_LINUX, error,
+ virRaiseError(conn, NULL, NULL, VIR_FROM_STATS_LINUX, error,
VIR_ERR_ERROR,
errmsg, info, NULL, value, 0, errmsg, info,
value);
diff -r a1dc6ccb7f50 src/storage_backend.c
--- a/src/storage_backend.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/storage_backend.c Wed Oct 29 11:36:21 2008 +0000
@@ -41,7 +41,7 @@
#include <selinux/selinux.h>
#endif
-#include "internal.h"
+#include "virterror.h"
#include "util.h"
#include "memory.h"
diff -r a1dc6ccb7f50 src/storage_backend_disk.c
--- a/src/storage_backend_disk.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/storage_backend_disk.c Wed Oct 29 11:36:21 2008 +0000
@@ -25,7 +25,7 @@
#include <string.h>
#include <unistd.h>
-#include "internal.h"
+#include "virterror.h"
#include "storage_backend_disk.h"
#include "util.h"
#include "memory.h"
diff -r a1dc6ccb7f50 src/storage_backend_fs.c
--- a/src/storage_backend_fs.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/storage_backend_fs.c Wed Oct 29 11:36:21 2008 +0000
@@ -40,7 +40,7 @@
#include <libxml/tree.h>
#include <libxml/xpath.h>
-#include "internal.h"
+#include "virterror.h"
#include "storage_backend_fs.h"
#include "storage_conf.h"
#include "util.h"
diff -r a1dc6ccb7f50 src/storage_backend_iscsi.c
--- a/src/storage_backend_iscsi.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/storage_backend_iscsi.c Wed Oct 29 11:36:21 2008 +0000
@@ -34,7 +34,7 @@
#include <unistd.h>
#include <dirent.h>
-#include "internal.h"
+#include "virterror.h"
#include "storage_backend_iscsi.h"
#include "util.h"
#include "memory.h"
diff -r a1dc6ccb7f50 src/storage_backend_logical.c
--- a/src/storage_backend_logical.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/storage_backend_logical.c Wed Oct 29 11:36:21 2008 +0000
@@ -31,7 +31,7 @@
#include <unistd.h>
#include <fcntl.h>
-#include "internal.h"
+#include "virterror.h"
#include "storage_backend_logical.h"
#include "storage_conf.h"
#include "util.h"
diff -r a1dc6ccb7f50 src/storage_conf.c
--- a/src/storage_conf.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/storage_conf.c Wed Oct 29 11:36:21 2008 +0000
@@ -38,7 +38,7 @@
#include <fcntl.h>
#include <string.h>
-#include "internal.h"
+#include "virterror.h"
#include "storage_conf.h"
#include "storage_backend.h"
#include "xml.h"
diff -r a1dc6ccb7f50 src/storage_conf.h
--- a/src/storage_conf.h Wed Oct 29 11:29:16 2008 +0000
+++ b/src/storage_conf.h Wed Oct 29 11:36:21 2008 +0000
@@ -262,7 +262,7 @@
}
#define virStorageReportError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_STORAGE, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_STORAGE, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
int virStoragePoolLoadAllConfigs(virConnectPtr conn,
diff -r a1dc6ccb7f50 src/storage_driver.c
--- a/src/storage_driver.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/storage_driver.c Wed Oct 29 11:36:21 2008 +0000
@@ -32,7 +32,7 @@
#include <errno.h>
#include <string.h>
-#include "internal.h"
+#include "virterror.h"
#include "driver.h"
#include "util.h"
#include "storage_driver.h"
diff -r a1dc6ccb7f50 src/test.c
--- a/src/test.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/test.c Wed Oct 29 11:36:21 2008 +0000
@@ -30,6 +30,8 @@
#include <unistd.h>
#include <sys/stat.h>
+
+#include "virterror.h"
#include "test.h"
#include "buf.h"
#include "util.h"
@@ -113,7 +115,7 @@
#define testError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_TEST, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_TEST, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
static virCapsPtr
diff -r a1dc6ccb7f50 src/util.c
--- a/src/util.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/util.c Wed Oct 29 11:36:21 2008 +0000
@@ -47,7 +47,7 @@
#include <paths.h>
#endif
-#include "internal.h"
+#include "virterror.h"
#include "event.h"
#include "buf.h"
#include "util.h"
@@ -67,7 +67,7 @@
#ifndef PROXY
#define ReportError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_NONE, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_NONE, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
int virFileStripSuffix(char *str,
diff -r a1dc6ccb7f50 src/virterror.c
--- a/src/virterror.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/virterror.c Wed Oct 29 11:36:21 2008 +0000
@@ -15,18 +15,17 @@
#include <string.h>
#include <stdarg.h>
-#include "internal.h"
-#include "libvirt/virterror.h"
+#include "virterror.h"
-virError __lastErr = /* the last error */
+virError virLastErr = /* the last error */
{ .code = 0, .domain = 0, .message = NULL, .level = VIR_ERR_NONE,
.conn = NULL, .dom = NULL, .str1 = NULL, .str2 = NULL, .str3 = NULL,
.int1 = 0, .int2 = 0, .net = NULL };
-static virErrorFunc virErrorHandler = NULL; /* global error handler */
-static void *virUserData = NULL; /* associated data */
+virErrorFunc virErrorHandler = NULL; /* global error handler */
+void *virUserData = NULL; /* associated data */
/*
- * Macro used to format the message as a string in __virRaiseError
+ * Macro used to format the message as a string in virRaiseError
* and borrowed from libxml2.
*/
#define VIR_GET_VAR_STR(msg, str) { \
@@ -74,9 +73,9 @@
virErrorPtr
virGetLastError(void)
{
- if (__lastErr.code == VIR_ERR_OK)
+ if (virLastErr.code == VIR_ERR_OK)
return (NULL);
- return (&__lastErr);
+ return (&virLastErr);
}
/*
@@ -94,10 +93,10 @@
{
if (to == NULL)
return (-1);
- if (__lastErr.code == VIR_ERR_OK)
+ if (virLastErr.code == VIR_ERR_OK)
return (0);
- memcpy(to, &__lastErr, sizeof(virError));
- return (__lastErr.code);
+ memcpy(to, &virLastErr, sizeof(virError));
+ return (virLastErr.code);
}
/**
@@ -126,7 +125,7 @@
void
virResetLastError(void)
{
- virResetError(&__lastErr);
+ virResetError(&virLastErr);
}
/**
@@ -331,7 +330,7 @@
}
/**
- * __virRaiseError:
+ * virRaiseError:
* @conn: the connection to the hypervisor if available
* @dom: the domain if available
* @net: the network if available
@@ -350,12 +349,12 @@
* immediately if a callback is found and store it for later handling.
*/
void
-__virRaiseError(virConnectPtr conn, virDomainPtr dom, virNetworkPtr net,
- int domain, int code, virErrorLevel level,
- const char *str1, const char *str2, const char *str3,
- int int1, int int2, const char *msg, ...)
+virRaiseError(virConnectPtr conn, virDomainPtr dom, virNetworkPtr net,
+ int domain, int code, virErrorLevel level,
+ const char *str1, const char *str2, const char *str3,
+ int int1, int int2, const char *msg, ...)
{
- virErrorPtr to = &__lastErr;
+ virErrorPtr to = &virLastErr;
void *userData = virUserData;
virErrorFunc handler = virErrorHandler;
char *str;
@@ -414,7 +413,7 @@
}
/**
- * __virErrorMsg:
+ * virErrorMsg:
* @error: the virErrorNumber
* @info: usually the first parameter string
*
@@ -424,7 +423,7 @@
* Returns the constant string associated to @error
*/
const char *
-__virErrorMsg(virErrorNumber error, const char *info)
+virErrorMsg(virErrorNumber error, const char *info)
{
const char *errmsg = NULL;
@@ -724,7 +723,7 @@
}
/**
- * __virReportErrorHelper
+ * virReportErrorHelper
*
* @conn: the connection to the hypervisor if available
* @dom: the domain if available
@@ -740,11 +739,11 @@
* Helper function to do most of the grunt work for individual driver
* ReportError
*/
-void __virReportErrorHelper(virConnectPtr conn, int domcode, int errcode,
- const char *filename ATTRIBUTE_UNUSED,
- const char *funcname ATTRIBUTE_UNUSED,
- long long linenr ATTRIBUTE_UNUSED,
- const char *fmt, ...)
+void virReportErrorHelper(virConnectPtr conn, int domcode, int errcode,
+ const char *filename ATTRIBUTE_UNUSED,
+ const char *funcname ATTRIBUTE_UNUSED,
+ long long linenr ATTRIBUTE_UNUSED,
+ const char *fmt, ...)
{
va_list args;
char errorMessage[1024];
@@ -758,8 +757,8 @@
errorMessage[0] = '\0';
}
- virerr = __virErrorMsg(errcode, (errorMessage[0] ? errorMessage : NULL));
- __virRaiseError(conn, NULL, NULL, domcode, errcode, VIR_ERR_ERROR,
- virerr, errorMessage, NULL, -1, -1, virerr, errorMessage);
+ virerr = virErrorMsg(errcode, (errorMessage[0] ? errorMessage : NULL));
+ virRaiseError(conn, NULL, NULL, domcode, errcode, VIR_ERR_ERROR,
+ virerr, errorMessage, NULL, -1, -1, virerr, errorMessage);
}
diff -r a1dc6ccb7f50 src/virterror.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/virterror.h Wed Oct 29 11:36:21 2008 +0000
@@ -0,0 +1,56 @@
+/*
+ * virterror.h: internal error handling
+ *
+ * Copyright (C) 2006-2008 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef __VIRT_ERROR_H_
+#define __VIRT_ERROR_H_
+
+#include "internal.h"
+
+extern virError virLastErr;
+extern virErrorFunc virErrorHandler;
+extern void *virUserData;
+
+/************************************************************************
+ * *
+ * API for error handling *
+ * *
+ ************************************************************************/
+void virRaiseError(virConnectPtr conn,
+ virDomainPtr dom,
+ virNetworkPtr net,
+ int domain,
+ int code,
+ virErrorLevel level,
+ const char *str1,
+ const char *str2,
+ const char *str3,
+ int int1, int int2, const char *msg, ...)
+ ATTRIBUTE_FORMAT(printf, 12, 13);
+const char *virErrorMsg(virErrorNumber error, const char *info);
+void virReportErrorHelper(virConnectPtr conn, int domcode, int errcode,
+ const char *filename ATTRIBUTE_UNUSED,
+ const char *funcname ATTRIBUTE_UNUSED,
+ long long linenr ATTRIBUTE_UNUSED,
+ const char *fmt, ...)
+ ATTRIBUTE_FORMAT(printf, 7, 8);
+
+
+#endif
diff -r a1dc6ccb7f50 src/xen_internal.c
--- a/src/xen_internal.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/xen_internal.c Wed Oct 29 11:36:21 2008 +0000
@@ -26,11 +26,6 @@
#include <errno.h>
#include <sys/utsname.h>
-#include "xs_internal.h"
-#include "stats_linux.h"
-#include "xend_internal.h"
-#include "util.h"
-
/* required for dom0_getdomaininfo_t */
#include <xen/dom0_ops.h>
#include <xen/version.h>
@@ -45,6 +40,14 @@
/* required for shutdown flags */
#include <xen/sched.h>
+#include "virterror.h"
+#include "driver.h"
+#include "util.h"
+#include "xen_unified.h"
+#include "xen_internal.h"
+#include "xs_internal.h"
+#include "stats_linux.h"
+#include "xend_internal.h"
#include "buf.h"
#include "capabilities.h"
#include "memory.h"
@@ -653,10 +656,6 @@
};
typedef struct xen_op_v2_dom xen_op_v2_dom;
-#include "internal.h"
-#include "driver.h"
-#include "xen_unified.h"
-#include "xen_internal.h"
#ifdef __linux__
#define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd"
@@ -720,7 +719,7 @@
#define virXenError(conn, code, fmt...) \
if (in_init == 0) \
- __virReportErrorHelper(conn, VIR_FROM_XEN, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_XEN, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
#ifndef PROXY
@@ -747,15 +746,15 @@
return;
- errmsg = __virErrorMsg(error, info);
+ errmsg =virErrorMsg(error, info);
if (func != NULL) {
snprintf(fullinfo, 999, "%s: %s", func, info);
fullinfo[999] = 0;
- __virRaiseError(conn, NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR,
+ virRaiseError(conn, NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR,
errmsg, fullinfo, NULL, value, 0, errmsg, fullinfo,
value);
} else {
- __virRaiseError(conn, NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR,
+ virRaiseError(conn, NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR,
errmsg, info, NULL, value, 0, errmsg, info,
value);
}
diff -r a1dc6ccb7f50 src/xen_unified.c
--- a/src/xen_unified.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/xen_unified.c Wed Oct 29 11:36:21 2008 +0000
@@ -27,7 +27,7 @@
#include <xen/dom0_ops.h>
#include <libxml/uri.h>
-#include "internal.h"
+#include "virterror.h"
#include "xen_unified.h"
@@ -59,7 +59,7 @@
};
#define xenUnifiedError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_XEN, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_XEN, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
/*
diff -r a1dc6ccb7f50 src/xend_internal.c
--- a/src/xend_internal.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/xend_internal.c Wed Oct 29 11:36:21 2008 +0000
@@ -32,6 +32,7 @@
#include <libxml/uri.h>
#include <errno.h>
+#include "virterror.h"
#include "xend_internal.h"
#include "driver.h"
#include "util.h"
@@ -105,7 +106,7 @@
#endif
#define virXendError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_XEND, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_XEND, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
#define virXendErrorInt(conn, code, ival) \
diff -r a1dc6ccb7f50 src/xm_internal.c
--- a/src/xm_internal.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/xm_internal.c Wed Oct 29 11:36:21 2008 +0000
@@ -35,6 +35,7 @@
#include <stdint.h>
#include <xen/dom0_ops.h>
+#include "virterror.h"
#include "xm_internal.h"
#include "xen_unified.h"
#include "xend_internal.h"
@@ -123,7 +124,7 @@
};
#define xenXMError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_XENXM, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_XENXM, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
int
diff -r a1dc6ccb7f50 src/xml.c
--- a/src/xml.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/xml.c Wed Oct 29 11:36:21 2008 +0000
@@ -16,14 +16,15 @@
#include <stdarg.h>
#include <limits.h>
#include <math.h> /* for isnan() */
-#include "internal.h"
+
+#include "virterror.h"
#include "xml.h"
#include "buf.h"
#include "util.h"
#include "memory.h"
#define virXMLError(conn, code, fmt...) \
- __virReportErrorHelper(conn, VIR_FROM_XML, code, __FILE__, \
+ virReportErrorHelper(conn, VIR_FROM_XML, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
diff -r a1dc6ccb7f50 src/xmlrpc.c
--- a/src/xmlrpc.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/xmlrpc.c Wed Oct 29 11:36:21 2008 +0000
@@ -11,7 +11,7 @@
#include <config.h>
#include "xmlrpc.h"
-#include "internal.h"
+#include "virterror.h"
#include "memory.h"
#include <libxml/nanohttp.h>
@@ -41,8 +41,8 @@
if (error == VIR_ERR_OK)
return;
- errmsg = __virErrorMsg(error, info);
- __virRaiseError(NULL, NULL, NULL, VIR_FROM_RPC, error, VIR_ERR_ERROR,
+ errmsg = virErrorMsg(error, info);
+ virRaiseError(NULL, NULL, NULL, VIR_FROM_RPC, error, VIR_ERR_ERROR,
errmsg, info, NULL, value, 0, errmsg, info, value);
}
diff -r a1dc6ccb7f50 src/xs_internal.c
--- a/src/xs_internal.c Wed Oct 29 11:29:16 2008 +0000
+++ b/src/xs_internal.c Wed Oct 29 11:36:21 2008 +0000
@@ -26,7 +26,7 @@
#include <xs.h>
-#include "internal.h"
+#include "virterror.h"
#include "driver.h"
#include "xen_unified.h"
#include "xs_internal.h"
@@ -88,7 +88,7 @@
#endif /* ! PROXY */
#define virXenStoreError(conn, code, fmt...) \
- __virReportErrorHelper(NULL, VIR_FROM_XENSTORE, code, __FILE__, \
+ virReportErrorHelper(NULL, VIR_FROM_XENSTORE, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
/************************************************************************
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
2
3
This is a request for comments on the initial prototype release of sVirt,
a project to add security labeling support to Linux-based virtualization.
Project page:
http://www.selinuxproject.org/page/SVirt
Previous libvirt discussions:
High-level requirements:
https://www.redhat.com/archives/libvir-list/2008-August/msg00255.html
XML security labels:
https://www.redhat.com/archives/libvir-list/2008-August/msg00740.html
A patch for libvirt is attached; and also included in a release tarball at
http://namei.org/svirt/. See 'readme.txt' there for more details on
building and running the code.
The purpose of this release is to establish a proof of concept of applying
security labels to VMs, and for discussion of the underlying technical
approach.
With this release, it is possible to define a security label for a
kvm/qemu domain in its XML configuration ('virsh edit'), launch the domain
and have it transition to the specified security label ('virsh start'),
then query the security label of the running domain ('virsh dominfo').
The following changes were made to libvirt:
1. Implementing a pluggable security label driver framework;
2. Implementing an SELinux security label driver for (1);
3. Wiring the security label framework into the Qemu driver;
4. Implementing basic libvirt API calls for initializing the driver,
and getting/setting domain security labels;
5. Extending the domain XML configuration to include security labels;
6. Adding domain security label display/edit/dump support to virsh.
One of the design principles I've followed with this is to reduce or
eliminate configuration wherever possible. If a variety of security
labeling drivers are present, libvirtd automatically detects which one to
enable and enables it. e.g. if SELinux is enabled on the system, the
SELinux labeling driver is enabled automatically when livbirtd starts.
Another is to treat security labels as opaque unless they're actually
being used for security purposes (e.g. to launch the domain). So, virsh
and the domain configuration code currently do not need to semantically
interpet security labels, just understand their format. This should suit
the initial simple goal of isolated domains, which only requires security
labels to be distinct.
The domain security label configuration format is as follows:
# virsh dumpxml sys1
<domain>
....
<seclabel model='selinux'>
<label>system_u:system_r:virtd_t:s0</label>
<policytype>targeted</policytype>
</seclabel>
</domain>
It's possible to query the security label of a running domain via virsh:
# virsh dominfo sys1
Id: 1
Name: sys1
UUID: fa3c8e06-0877-2a08-06fd-f2479b7bacb4
OS Type: hvm
State: running
CPU(s): 1
CPU time: 11.4s
Max memory: 524288 kB
Used memory: 524288 kB
Autostart: disable
Security label: system_u:system_r:virtd_t:s0 (selinux/targeted/enforcing)
The security label is deterimed via the new virDomainGetSecLabel() API
method, which is transported over RPC to the backend driver (qemu in this
case), and is entirely independent of the local security model, if any.
e.g. this command could be run remotely from an entirely different
platform: you just see what's happening on the remote system, as with
other attributes of the domain.
Feedback on the design thus far is sought before proceeding to more
comprehensive integration.
In particular, I'd be interested in any thoughts on the placement of the
security labeling driver within libvirt, as this seems to be the most
critical architectural issue (I've already refactored this aspect once).
Currently, the idea is to attach the security labeling driver to the virt
driver, rather than implement it independently as a top-level component as
in the case of other types of drivers (e.g. storage). This is because
process-based security labeling is highly dependent on the kind of
virtualization in use, and may not make sense at all in some cases (e.g.
when using a non-Linux hypervisor, or containers).
In the case of qemu, a security labeling driver is added to qemud:
@@ -63,6 +64,7 @@ struct qemud_driver {
char *vncListen;
virCapsPtr caps;
+ virSecLabelDriverPtr secLabelDriver;
};
and then initialized during qemud startup from qemudSecLabelInit().
During initialization, any available security labeling drivers are probed,
and the first one which thinks it should be used is installed. Top-level
libvirt API calls are then dispatched to the active security labeling
driver via the backend virt driver, as necessary.
Note that the security labeling framework in this release is always
built-in -- it can be made a compile-time option later if desired.
Requirements not yet addressed include:
- Labeling of resources and generally comprehensive labeling management
- Automatic labeling (e.g. for the simple isolation use-case)
- Integration of labeling support into higher-level management tools such
as virt-manager
- Integration with the audit subsystem to help with administration and
debugging
- Domain of interpretation (DOI) checking/translation
- Python bindings
As mentioned, the goal at this stage is to get feedback on the underlying
design: comments welcome!
- James
--
James Morris
<jmorris(a)namei.org>
7
18
29 Oct '08
Hi,
recent kvm allows to hot add scsi/virtio disks, it uses pci hotplugging
for that. Attached patch adds support for this to libvirt.
-- Guido
3
10
Currently __virStringListFree is freeing only the list nodes, but not
the strings on the list (and neither is anyone else freeing these).
This small patch fixes that, and documents the two __virStringList
functions.
Dave
2
1
This tiny patch adds $LIBVIRT_CFLAGS to the flags used when compiling
the Java Native Interface C code in libvirt-java. This allows one to
build, for example, against a local (non-installed) libvirt tree.
Dave
2
1
Attached is a preliminary patch implementing the python bindings for domain events, and the EventImpl code.
This implements a python test app equivalent to the code in the C event-test app. Contrary to what Daniel B originally suggested, I thought that the EventImpl would be useful to expose for apps that are strictly using python, and not integrating with glib, or another event loop. It also makes the test case easier to debug.
I have not marked this with [PATCH] in the subject, as I don't believe it is quite complete.
I am still having a few issues with the Refcounting in the C code, and I think there is still some cleanup code I haven't quite handled quite right.
That said - I would welcome some comments/suggestions on this thus far, to make sure I'm not going off in a direction contrary to where you think I should be.
examples/domain-events/events-python/event-test.py | 187 ++++++++
python/generator.py | 8
python/libvir.c | 454 +++++++++++++++++++++
python/libvir.py | 20
python/libvirt_wrap.h | 27 +
python/types.c | 48 ++
6 files changed, 740 insertions(+), 4 deletions(-)
3
4
[libvirt] PATCH: Move domain event helpers out of internal.h/libvirt.c
by Daniel P. Berrange 29 Oct '08
by Daniel P. Berrange 29 Oct '08
29 Oct '08
There are a bunch of helper functions relating to domain events, which
are only used internally by hypervisor drivers. Following the principle
that libvirt.c should only contain functions exported in the API, and
internal.h should not define any function signatures, these helpers
need to move.
So I'm inventing a domain_events.c, and domain_events.h file to contain
the domain events helper code, in much same way as domain_conf.c and
domain_conf.h contain the domain XML helper code.
Again no functional change here. With this patch applied, the cleanup
of internal.h is basically complete - at least more than good enough
for now. It'd be nice to move the struct definitions of virDomainPtr,
etc elsewhere, perhaps to src/libvirt.h because they're public API,
but not exported publically.
b/src/domain_event.c | 229 ++++++++++++++++++++++++++++++++++++++++++++++++++
b/src/domain_event.h | 83 ++++++++++++++++++
qemud/event.c | 8 -
qemud/event.h | 7 +
src/Makefile.am | 1
src/internal.h | 73 ---------------
src/libvirt.c | 201 -------------------------------------------
src/qemu_conf.h | 1
src/remote_internal.c | 1
9 files changed, 326 insertions(+), 278 deletions(-)
Daniel
diff -r 0325a25d1762 qemud/event.c
--- a/qemud/event.c Wed Oct 29 11:48:08 2008 +0000
+++ b/qemud/event.c Wed Oct 29 12:03:29 2008 +0000
@@ -489,7 +489,7 @@
}
int
-__virEventHandleTypeToPollEvent(virEventHandleType events)
+virEventHandleTypeToPollEvent(int events)
{
int ret = 0;
if(events & VIR_EVENT_HANDLE_READABLE)
@@ -503,10 +503,10 @@
return ret;
}
-virEventHandleType
-__virPollEventToEventHandleType(int events)
+int
+virPollEventToEventHandleType(int events)
{
- virEventHandleType ret = 0;
+ int ret = 0;
if(events & POLLIN)
ret |= VIR_EVENT_HANDLE_READABLE;
if(events & POLLOUT)
diff -r 0325a25d1762 qemud/event.h
--- a/qemud/event.h Wed Oct 29 11:48:08 2008 +0000
+++ b/qemud/event.h Wed Oct 29 12:03:29 2008 +0000
@@ -105,4 +105,11 @@
*/
int virEventRunOnce(void);
+int
+virEventHandleTypeToPollEvent(int events);
+int
+virPollEventToEventHandleType(int events);
+
+
+
#endif /* __VIRTD_EVENT_H__ */
diff -r 0325a25d1762 src/Makefile.am
--- a/src/Makefile.am Wed Oct 29 11:48:08 2008 +0000
+++ b/src/Makefile.am Wed Oct 29 12:03:29 2008 +0000
@@ -150,6 +150,7 @@
hash.c hash.h \
internal.h \
libvirt.c \
+ domain_event.c domain_event.h \
$(GENERIC_LIB_SOURCES) \
$(DOMAIN_CONF_SOURCES) \
$(NETWORK_CONF_SOURCES) \
diff -r 0325a25d1762 src/domain_event.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/domain_event.c Wed Oct 29 12:03:29 2008 +0000
@@ -0,0 +1,229 @@
+/*
+ * domain_event.c: domain event queue processing helpers
+ *
+ * Copyright (C) 2008 VirtualIron
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Ben Guthro
+ */
+
+#include <config.h>
+
+#include "domain_event.h"
+#include "libvirt.h"
+#include "memory.h"
+
+
+/**
+ * virDomainEventCallbackListFree:
+ * @list: event callback list head
+ *
+ * Free the memory in the domain event callback list
+ */
+void
+virDomainEventCallbackListFree(virDomainEventCallbackListPtr list)
+{
+ int i;
+ for (i=0; i<list->count; i++) {
+ VIR_FREE(list->callbacks[i]);
+ }
+ VIR_FREE(list);
+}
+/**
+ * virDomainEventCallbackListRemove:
+ * @conn: pointer to the connection
+ * @cbList: the list
+ * @callback: the callback to remove
+ *
+ * Internal function to remove a callback from a virDomainEventCallbackListPtr
+ */
+int
+virDomainEventCallbackListRemove(virConnectPtr conn,
+ virDomainEventCallbackListPtr cbList,
+ virConnectDomainEventCallback callback)
+{
+ int i;
+ for (i = 0 ; i < cbList->count ; i++) {
+ if(cbList->callbacks[i]->cb == callback &&
+ cbList->callbacks[i]->conn == conn) {
+ virUnrefConnect(cbList->callbacks[i]->conn);
+ VIR_FREE(cbList->callbacks[i]);
+
+ if (i < (cbList->count - 1))
+ memmove(cbList->callbacks + i,
+ cbList->callbacks + i + 1,
+ sizeof(*(cbList->callbacks)) *
+ (cbList->count - (i + 1)));
+
+ if (VIR_REALLOC_N(cbList->callbacks,
+ cbList->count - 1) < 0) {
+ ; /* Failure to reduce memory allocation isn't fatal */
+ }
+ cbList->count--;
+
+ return 0;
+ }
+ }
+ return -1;
+}
+
+/**
+ * virDomainEventCallbackListAdd:
+ * @conn: pointer to the connection
+ * @cbList: the list
+ * @callback: the callback to add
+ * @opaque: opaque data tio pass to callback
+ *
+ * Internal function to add a callback from a virDomainEventCallbackListPtr
+ */
+int
+virDomainEventCallbackListAdd(virConnectPtr conn,
+ virDomainEventCallbackListPtr cbList,
+ virConnectDomainEventCallback callback,
+ void *opaque)
+{
+ virDomainEventCallbackPtr event;
+ int n;
+
+ /* Check incoming */
+ if ( !cbList ) {
+ return -1;
+ }
+
+ /* check if we already have this callback on our list */
+ for (n=0; n < cbList->count; n++) {
+ if(cbList->callbacks[n]->cb == callback &&
+ conn == cbList->callbacks[n]->conn) {
+ DEBUG0("WARNING: Callback already tracked");
+ return -1;
+ }
+ }
+ /* Allocate new event */
+ if (VIR_ALLOC(event) < 0) {
+ DEBUG0("Error allocating event");
+ return -1;
+ }
+ event->conn = conn;
+ event->cb = callback;
+ event->opaque = opaque;
+
+ /* Make space on list */
+ n = cbList->count;
+ if (VIR_REALLOC_N(cbList->callbacks, n + 1) < 0) {
+ DEBUG0("Error reallocating list");
+ VIR_FREE(event);
+ return -1;
+ }
+
+ event->conn->refs++;
+
+ cbList->callbacks[n] = event;
+ cbList->count++;
+ return 0;
+}
+
+/**
+ * virDomainEventQueueFree:
+ * @queue: pointer to the queue
+ *
+ * Free the memory in the queue. We process this like a list here
+ */
+void
+virDomainEventQueueFree(virDomainEventQueuePtr queue)
+{
+ int i;
+ for ( i=0 ; i<queue->count ; i++ ) {
+ VIR_FREE(queue->events[i]);
+ }
+ VIR_FREE(queue);
+}
+
+/**
+ * virDomainEventCallbackQueuePop:
+ * @evtQueue: the queue of events
+ *
+ * Internal function to pop off, and return the front of the queue
+ * NOTE: The caller is responsible for freeing the returned object
+ *
+ * Returns: virDomainEventPtr on success NULL on failure.
+ */
+virDomainEventPtr
+virDomainEventCallbackQueuePop(virDomainEventQueuePtr evtQueue)
+{
+ virDomainEventPtr ret;
+
+ if(!evtQueue || evtQueue->count == 0 )
+ return NULL;
+
+ ret = evtQueue->events[0];
+
+ memmove(evtQueue->events,
+ evtQueue->events + 1,
+ sizeof(*(evtQueue->events)) *
+ (evtQueue->count - 1));
+
+ if (VIR_REALLOC_N(evtQueue->events,
+ evtQueue->count - 1) < 0) {
+ ; /* Failure to reduce memory allocation isn't fatal */
+ }
+ evtQueue->count--;
+
+ return ret;
+}
+
+/**
+ * virDomainEventCallbackQueuePush:
+ * @evtQueue: the dom event queue
+ * @dom: the domain to add
+ * @event: the event to add
+ *
+ * Internal function to push onto the back of an virDomainEventQueue
+ *
+ * Returns: 0 on success, -1 on failure
+ */
+int
+virDomainEventCallbackQueuePush(virDomainEventQueuePtr evtQueue,
+ virDomainPtr dom,
+ virDomainEventType event)
+{
+ virDomainEventPtr domEvent;
+
+ /* Check incoming */
+ if ( !evtQueue ) {
+ return -1;
+ }
+
+ /* Allocate new event */
+ if (VIR_ALLOC(domEvent) < 0) {
+ DEBUG0("Error allocating event");
+ return -1;
+ }
+ domEvent->dom = dom;
+ domEvent->event = event;
+
+ /* Make space on queue */
+ if (VIR_REALLOC_N(evtQueue->events,
+ evtQueue->count + 1) < 0) {
+ DEBUG0("Error reallocating queue");
+ VIR_FREE(domEvent);
+ return -1;
+ }
+
+ evtQueue->events[evtQueue->count] = domEvent;
+ evtQueue->count++;
+ return 0;
+}
+
diff -r 0325a25d1762 src/domain_event.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/domain_event.h Wed Oct 29 12:03:29 2008 +0000
@@ -0,0 +1,83 @@
+/*
+ * domain_event.h: domain event queue processing helpers
+ *
+ * Copyright (C) 2008 VirtualIron
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Ben Guthro
+ */
+
+#include "internal.h"
+
+
+#ifndef __DOMAIN_EVENT_H__
+#define __DOMAIN_EVENT_H__
+
+struct _virDomainEventCallback {
+ virConnectPtr conn;
+ virConnectDomainEventCallback cb;
+ void *opaque;
+};
+typedef struct _virDomainEventCallback virDomainEventCallback;
+typedef virDomainEventCallback *virDomainEventCallbackPtr;
+
+struct _virDomainEventCallbackList {
+ unsigned int count;
+ virDomainEventCallbackPtr *callbacks;
+};
+typedef struct _virDomainEventCallbackList virDomainEventCallbackList;
+typedef virDomainEventCallbackList *virDomainEventCallbackListPtr;
+
+void virDomainEventCallbackListFree(virDomainEventCallbackListPtr list);
+
+int virDomainEventCallbackListAdd(virConnectPtr conn,
+ virDomainEventCallbackListPtr cbList,
+ virConnectDomainEventCallback callback,
+ void *opaque);
+
+int virDomainEventCallbackListRemove(virConnectPtr conn,
+ virDomainEventCallbackListPtr cbList,
+ virConnectDomainEventCallback callback);
+
+/**
+ * Dispatching domain events that come in while
+ * in a call / response rpc
+ */
+struct _virDomainEvent {
+ virDomainPtr dom;
+ virDomainEventType event;
+};
+typedef struct _virDomainEvent virDomainEvent;
+typedef virDomainEvent *virDomainEventPtr;
+
+struct _virDomainEventQueue {
+ unsigned int count;
+ virDomainEventPtr *events;
+};
+typedef struct _virDomainEventQueue virDomainEventQueue;
+typedef virDomainEventQueue *virDomainEventQueuePtr;
+
+int virDomainEventCallbackQueuePush(virDomainEventQueuePtr evtQueue,
+ virDomainPtr dom,
+ virDomainEventType event);
+
+virDomainEventPtr
+virDomainEventCallbackQueuePop(virDomainEventQueuePtr evtQueue);
+
+void virDomainEventQueueFree(virDomainEventQueuePtr queue);
+
+
+#endif
diff -r 0325a25d1762 src/internal.h
--- a/src/internal.h Wed Oct 29 11:48:08 2008 +0000
+++ b/src/internal.h Wed Oct 29 12:03:29 2008 +0000
@@ -294,77 +294,4 @@
char key[PATH_MAX]; /* unique key for storage vol */
};
-
-/**
- * Domain Event Notification
- */
-
-struct _virDomainEventCallback {
- virConnectPtr conn;
- virConnectDomainEventCallback cb;
- void *opaque;
-};
-typedef struct _virDomainEventCallback virDomainEventCallback;
-typedef virDomainEventCallback *virDomainEventCallbackPtr;
-
-struct _virDomainEventCallbackList {
- unsigned int count;
- virDomainEventCallbackPtr *callbacks;
-};
-typedef struct _virDomainEventCallbackList virDomainEventCallbackList;
-typedef virDomainEventCallbackList *virDomainEventCallbackListPtr;
-
-void __virDomainEventCallbackListFree(virDomainEventCallbackListPtr list);
-#define virDomainEventCallbackListFree(x) __virDomainEventCallbackListFree(x)
-
-int __virDomainEventCallbackListAdd(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
- virConnectDomainEventCallback callback,
- void *opaque);
-#define virDomainEventCallbackListAdd(a,b,c,d) \
- __virDomainEventCallbackListAdd((a),(b),(c),(d))
-
-int __virDomainEventCallbackListRemove(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
- virConnectDomainEventCallback callback);
-#define virDomainEventCallbackListRemove(a,b,c) \
- __virDomainEventCallbackListRemove((a),(b),(c))
-
-int __virEventHandleTypeToPollEvent(virEventHandleType events);
-#define virEventHandleTypeToPollEvent(x) __virEventHandleTypeToPollEvent(x)
-
-virEventHandleType __virPollEventToEventHandleType(int events);
-#define virPollEventToEventHandleType(x) __virPollEventToEventHandleType(x)
-
-/**
- * Dispatching domain events that come in while
- * in a call / response rpc
- */
-struct _virDomainEvent {
- virDomainPtr dom;
- virDomainEventType event;
-};
-typedef struct _virDomainEvent virDomainEvent;
-typedef virDomainEvent *virDomainEventPtr;
-
-struct _virDomainEventQueue {
- unsigned int count;
- virDomainEventPtr *events;
-};
-typedef struct _virDomainEventQueue virDomainEventQueue;
-typedef virDomainEventQueue *virDomainEventQueuePtr;
-
-int __virDomainEventCallbackQueuePush(virDomainEventQueuePtr evtQueue,
- virDomainPtr dom,
- virDomainEventType event);
-#define virDomainEventCallbackQueuePush(a,b,c) \
- __virDomainEventCallbackQueuePush((a),(b),(c))
-
-virDomainEventPtr
-__virDomainEventCallbackQueuePop(virDomainEventQueuePtr evtQueue);
-#define virDomainEventCallbackQueuePop(x) __virDomainEventCallbackQueuePop(x)
-
-void __virDomainEventQueueFree(virDomainEventQueuePtr queue);
-#define virDomainEventQueueFree(x) __virDomainEventQueueFree(x)
-
#endif /* __VIR_INTERNAL_H__ */
diff -r 0325a25d1762 src/libvirt.c
--- a/src/libvirt.c Wed Oct 29 11:48:08 2008 +0000
+++ b/src/libvirt.c Wed Oct 29 12:03:29 2008 +0000
@@ -5371,207 +5371,6 @@
return -1;
}
-/**
- * __virDomainEventCallbackListFree:
- * @list: event callback list head
- *
- * Free the memory in the domain event callback list
- */
-void
-__virDomainEventCallbackListFree(virDomainEventCallbackListPtr list)
-{
- int i;
- for (i=0; i<list->count; i++) {
- VIR_FREE(list->callbacks[i]);
- }
- VIR_FREE(list);
-}
-/**
- * __virDomainEventCallbackListRemove:
- * @conn: pointer to the connection
- * @cbList: the list
- * @callback: the callback to remove
- *
- * Internal function to remove a callback from a virDomainEventCallbackListPtr
- */
-int
-__virDomainEventCallbackListRemove(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
- virConnectDomainEventCallback callback)
-{
- int i;
- for (i = 0 ; i < cbList->count ; i++) {
- if(cbList->callbacks[i]->cb == callback &&
- cbList->callbacks[i]->conn == conn) {
- virUnrefConnect(cbList->callbacks[i]->conn);
- VIR_FREE(cbList->callbacks[i]);
-
- if (i < (cbList->count - 1))
- memmove(cbList->callbacks + i,
- cbList->callbacks + i + 1,
- sizeof(*(cbList->callbacks)) *
- (cbList->count - (i + 1)));
-
- if (VIR_REALLOC_N(cbList->callbacks,
- cbList->count - 1) < 0) {
- ; /* Failure to reduce memory allocation isn't fatal */
- }
- cbList->count--;
-
- return 0;
- }
- }
- return -1;
-}
-
-/**
- * __virDomainEventCallbackListAdd:
- * @conn: pointer to the connection
- * @cbList: the list
- * @callback: the callback to add
- * @opaque: opaque data tio pass to callback
- *
- * Internal function to add a callback from a virDomainEventCallbackListPtr
- */
-int
-__virDomainEventCallbackListAdd(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
- virConnectDomainEventCallback callback,
- void *opaque)
-{
- virDomainEventCallbackPtr event;
- int n;
-
- /* Check incoming */
- if ( !cbList ) {
- return -1;
- }
-
- /* check if we already have this callback on our list */
- for (n=0; n < cbList->count; n++) {
- if(cbList->callbacks[n]->cb == callback &&
- conn == cbList->callbacks[n]->conn) {
- DEBUG0("WARNING: Callback already tracked");
- return -1;
- }
- }
- /* Allocate new event */
- if (VIR_ALLOC(event) < 0) {
- DEBUG0("Error allocating event");
- return -1;
- }
- event->conn = conn;
- event->cb = callback;
- event->opaque = opaque;
-
- /* Make space on list */
- n = cbList->count;
- if (VIR_REALLOC_N(cbList->callbacks, n + 1) < 0) {
- DEBUG0("Error reallocating list");
- VIR_FREE(event);
- return -1;
- }
-
- event->conn->refs++;
-
- cbList->callbacks[n] = event;
- cbList->count++;
- return 0;
-}
-
-/**
- * __virDomainEventQueueFree:
- * @queue: pointer to the queue
- *
- * Free the memory in the queue. We process this like a list here
- */
-void
-__virDomainEventQueueFree(virDomainEventQueuePtr queue)
-{
- int i;
- for ( i=0 ; i<queue->count ; i++ ) {
- VIR_FREE(queue->events[i]);
- }
- VIR_FREE(queue);
-}
-
-/**
- * __virDomainEventCallbackQueuePop:
- * @evtQueue: the queue of events
- *
- * Internal function to pop off, and return the front of the queue
- * NOTE: The caller is responsible for freeing the returned object
- *
- * Returns: virDomainEventPtr on success NULL on failure.
- */
-virDomainEventPtr
-__virDomainEventCallbackQueuePop(virDomainEventQueuePtr evtQueue)
-{
- virDomainEventPtr ret;
-
- if(!evtQueue || evtQueue->count == 0 )
- return NULL;
-
- ret = evtQueue->events[0];
-
- memmove(evtQueue->events,
- evtQueue->events + 1,
- sizeof(*(evtQueue->events)) *
- (evtQueue->count - 1));
-
- if (VIR_REALLOC_N(evtQueue->events,
- evtQueue->count - 1) < 0) {
- ; /* Failure to reduce memory allocation isn't fatal */
- }
- evtQueue->count--;
-
- return ret;
-}
-
-/**
- * __virDomainEventCallbackQueuePush:
- * @evtQueue: the dom event queue
- * @dom: the domain to add
- * @event: the event to add
- *
- * Internal function to push onto the back of an virDomainEventQueue
- *
- * Returns: 0 on success, -1 on failure
- */
-int
-__virDomainEventCallbackQueuePush(virDomainEventQueuePtr evtQueue,
- virDomainPtr dom,
- virDomainEventType event)
-{
- virDomainEventPtr domEvent;
-
- /* Check incoming */
- if ( !evtQueue ) {
- return -1;
- }
-
- /* Allocate new event */
- if (VIR_ALLOC(domEvent) < 0) {
- DEBUG0("Error allocating event");
- return -1;
- }
- domEvent->dom = dom;
- domEvent->event = event;
-
- /* Make space on queue */
- if (VIR_REALLOC_N(evtQueue->events,
- evtQueue->count + 1) < 0) {
- DEBUG0("Error reallocating queue");
- VIR_FREE(domEvent);
- return -1;
- }
-
- evtQueue->events[evtQueue->count] = domEvent;
- evtQueue->count++;
- return 0;
-}
-
-
/************************************************************************
* *
diff -r 0325a25d1762 src/qemu_conf.h
--- a/src/qemu_conf.h Wed Oct 29 11:48:08 2008 +0000
+++ b/src/qemu_conf.h Wed Oct 29 12:03:29 2008 +0000
@@ -31,6 +31,7 @@
#include "capabilities.h"
#include "network_conf.h"
#include "domain_conf.h"
+#include "domain_event.h"
#define qemudDebug(fmt, ...) do {} while(0)
diff -r 0325a25d1762 src/remote_internal.c
--- a/src/remote_internal.c Wed Oct 29 11:48:08 2008 +0000
+++ b/src/remote_internal.c Wed Oct 29 12:03:29 2008 +0000
@@ -75,6 +75,7 @@
#include "virterror.h"
#include "libvirt.h"
+#include "domain_event.h"
#include "driver.h"
#include "buf.h"
#include "qparams.h"
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
3
2
[libvirt] PATCH Move misc functions out of hash.c/internal.h into libvirt.c
by Daniel P. Berrange 29 Oct '08
by Daniel P. Berrange 29 Oct '08
29 Oct '08
The hash.c file contains a nice generic implementation of hash tables, and
then adds a bunch of code for creating/deleting virDomainPtr, virConnectPtr,
virNetworkPtr and virStoragePoolPtr objects which is totally unrelated to
hash tables.
The internal.h file also contains function signatures for a bunch of
APIs which are exported in the libvirt.so, but not part of the official
public API in libvirt/libvirt.h. Their impl is mostly in libvirt.c,
along with the aforementioned stuff from hash.c
To improve internal modularization / cross-file dependancies, this patch
tries to isolate the impl of all exported functions in libvirt.c, and for
those API which are part of the public API, place their declaration in
the src/libvirt.h file.
So, the src/libvirt.h file gets the following exported, but not public
funtions, with the impl of the virGetXXX/virUnrefXXX moving out of hash.c
and into libvirt.c to be alongside other impls of public APIs.
virConnectPtr virGetConnect(void);
int virUnrefConnect(virConnectPtr conn);
virDomainPtr __virGetDomain(virConnectPtr conn,
const char *name,
const unsigned char *uuid);
int virUnrefDomain(virDomainPtr domain);
virNetworkPtr __virGetNetwork(virConnectPtr conn,
const char *name,
const unsigned char *uuid);
int virUnrefNetwork(virNetworkPtr network);
virStoragePoolPtr __virGetStoragePool(virConnectPtr conn,
const char *name,
const unsigned char *uuid);
int virUnrefStoragePool(virStoragePoolPtr pool);
virStorageVolPtr __virGetStorageVol(virConnectPtr conn,
const char *pool,
const char *name,
const char *key);
int virUnrefStorageVol(virStorageVolPtr vol);
int __virStateInitialize(void);
int __virStateCleanup(void);
int __virStateReload(void);
int __virStateActive(void);
int __virStateSigDispatcher(siginfo_t *siginfo);
int __virDrvSupportsFeature (virConnectPtr conn, int feature);
int __virDomainMigratePrepare (virConnectPtr dconn,
char **cookie,
int *cookielen,
const char *uri_in,
char **uri_out,
unsigned long flags,
const char *dname,
unsigned long bandwidth);
int __virDomainMigratePerform (virDomainPtr domain,
const char *cookie,
int cookielen,
const char *uri,
unsigned long flags,
const char *dname,
unsigned long bandwidth);
virDomainPtr __virDomainMigrateFinish (virConnectPtr dconn,
const char *dname,
const char *cookie,
int cookielen,
const char *uri,
unsigned long flags);
Finally, the files for internal hypervisor drivers need to include this
new libvirt.h file.
This is step 2 in cleaning up the definitions visible in internal.h
As before, there should be no functional change in this patch, merely
a bunch of code moving, and #include fixups
b/src/libvirt.h | 98 ++++++
qemud/qemud.c | 2
qemud/remote.c | 2
src/hash.c | 726 -------------------------------------------------
src/internal.h | 52 ---
src/libvirt.c | 728 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/lxc_driver.c | 1
src/network_driver.c | 1
src/openvz_driver.c | 1
src/proxy_internal.h | 3
src/qemu_driver.c | 1
src/remote_internal.c | 1
src/storage_driver.c | 1
src/test.c | 1
src/xen_internal.c | 1
src/xend_internal.c | 1
src/xm_internal.c | 1
src/xs_internal.c | 1
18 files changed, 842 insertions(+), 780 deletions(-)
Daniel
diff -r ef2d00e6bc78 qemud/qemud.c
--- a/qemud/qemud.c Wed Oct 29 11:36:21 2008 +0000
+++ b/qemud/qemud.c Wed Oct 29 11:48:08 2008 +0000
@@ -49,7 +49,7 @@
#include <signal.h>
#include <netdb.h>
-#include "internal.h"
+#include "libvirt.h"
#include "qemud.h"
#include "util.h"
diff -r ef2d00e6bc78 qemud/remote.c
--- a/qemud/remote.c Wed Oct 29 11:36:21 2008 +0000
+++ b/qemud/remote.c Wed Oct 29 11:48:08 2008 +0000
@@ -48,7 +48,7 @@
#include <polkit-dbus/polkit-dbus.h>
#endif
-#include "internal.h"
+#include "libvirt.h"
#include "qemud.h"
#include "memory.h"
diff -r ef2d00e6bc78 src/hash.c
--- a/src/hash.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/hash.c Wed Oct 29 11:48:08 2008 +0000
@@ -25,6 +25,7 @@
#include <libxml/threads.h>
#include "virterror.h"
+#include "libvirt.h"
#include "hash.h"
#include "memory.h"
@@ -594,728 +595,3 @@
return (NULL);
}
-/************************************************************************
- * *
- * Domain and Connections allocations *
- * *
- ************************************************************************/
-
-/**
- * virDomainFreeName:
- * @domain: a domain object
- *
- * Destroy the domain object, this is just used by the domain hash callback.
- *
- * Returns 0 in case of success and -1 in case of failure.
- */
-static int
-virDomainFreeName(virDomainPtr domain, const char *name ATTRIBUTE_UNUSED)
-{
- return (virDomainFree(domain));
-}
-
-/**
- * virNetworkFreeName:
- * @network: a network object
- *
- * Destroy the network object, this is just used by the network hash callback.
- *
- * Returns 0 in case of success and -1 in case of failure.
- */
-static int
-virNetworkFreeName(virNetworkPtr network, const char *name ATTRIBUTE_UNUSED)
-{
- return (virNetworkFree(network));
-}
-
-/**
- * virStoragePoolFreeName:
- * @pool: a pool object
- *
- * Destroy the pool object, this is just used by the pool hash callback.
- *
- * Returns 0 in case of success and -1 in case of failure.
- */
-static int
-virStoragePoolFreeName(virStoragePoolPtr pool, const char *name ATTRIBUTE_UNUSED)
-{
- return (virStoragePoolFree(pool));
-}
-
-/**
- * virStorageVolFreeName:
- * @vol: a vol object
- *
- * Destroy the vol object, this is just used by the vol hash callback.
- *
- * Returns 0 in case of success and -1 in case of failure.
- */
-static int
-virStorageVolFreeName(virStorageVolPtr vol, const char *name ATTRIBUTE_UNUSED)
-{
- return (virStorageVolFree(vol));
-}
-
-/**
- * virGetConnect:
- *
- * Allocates a new hypervisor connection structure
- *
- * Returns a new pointer or NULL in case of error.
- */
-virConnectPtr
-virGetConnect(void) {
- virConnectPtr ret;
-
- if (VIR_ALLOC(ret) < 0) {
- virHashError(NULL, VIR_ERR_NO_MEMORY, "%s", _("allocating connection"));
- goto failed;
- }
- ret->magic = VIR_CONNECT_MAGIC;
- ret->driver = NULL;
- ret->networkDriver = NULL;
- ret->privateData = NULL;
- ret->networkPrivateData = NULL;
- ret->domains = virHashCreate(20);
- if (ret->domains == NULL)
- goto failed;
- ret->networks = virHashCreate(20);
- if (ret->networks == NULL)
- goto failed;
- ret->storagePools = virHashCreate(20);
- if (ret->storagePools == NULL)
- goto failed;
- ret->storageVols = virHashCreate(20);
- if (ret->storageVols == NULL)
- goto failed;
-
- pthread_mutex_init(&ret->lock, NULL);
-
- ret->refs = 1;
- return(ret);
-
-failed:
- if (ret != NULL) {
- if (ret->domains != NULL)
- virHashFree(ret->domains, (virHashDeallocator) virDomainFreeName);
- if (ret->networks != NULL)
- virHashFree(ret->networks, (virHashDeallocator) virNetworkFreeName);
- if (ret->storagePools != NULL)
- virHashFree(ret->storagePools, (virHashDeallocator) virStoragePoolFreeName);
- if (ret->storageVols != NULL)
- virHashFree(ret->storageVols, (virHashDeallocator) virStorageVolFreeName);
-
- pthread_mutex_destroy(&ret->lock);
- VIR_FREE(ret);
- }
- return(NULL);
-}
-
-/**
- * virReleaseConnect:
- * @conn: the hypervisor connection to release
- *
- * Unconditionally release all memory associated with a connection.
- * The conn.lock mutex must be held prior to calling this, and will
- * be released prior to this returning. The connection obj must not
- * be used once this method returns.
- */
-static void
-virReleaseConnect(virConnectPtr conn) {
- DEBUG("release connection %p %s", conn, conn->name);
- if (conn->domains != NULL)
- virHashFree(conn->domains, (virHashDeallocator) virDomainFreeName);
- if (conn->networks != NULL)
- virHashFree(conn->networks, (virHashDeallocator) virNetworkFreeName);
- if (conn->storagePools != NULL)
- virHashFree(conn->storagePools, (virHashDeallocator) virStoragePoolFreeName);
- if (conn->storageVols != NULL)
- virHashFree(conn->storageVols, (virHashDeallocator) virStorageVolFreeName);
-
- virResetError(&conn->err);
- if (virLastErr.conn == conn)
- virLastErr.conn = NULL;
-
- VIR_FREE(conn->name);
-
- pthread_mutex_unlock(&conn->lock);
- pthread_mutex_destroy(&conn->lock);
- VIR_FREE(conn);
-}
-
-/**
- * virUnrefConnect:
- * @conn: the hypervisor connection to unreference
- *
- * Unreference the connection. If the use count drops to zero, the structure is
- * actually freed.
- *
- * Returns the reference count or -1 in case of failure.
- */
-int
-virUnrefConnect(virConnectPtr conn) {
- int refs;
-
- if ((!VIR_IS_CONNECT(conn))) {
- virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return(-1);
- }
- pthread_mutex_lock(&conn->lock);
- DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
- conn->refs--;
- refs = conn->refs;
- if (refs == 0) {
- virReleaseConnect(conn);
- /* Already unlocked mutex */
- return (0);
- }
- pthread_mutex_unlock(&conn->lock);
- return (refs);
-}
-
-/**
- * virGetDomain:
- * @conn: the hypervisor connection
- * @name: pointer to the domain name
- * @uuid: pointer to the uuid
- *
- * Lookup if the domain is already registered for that connection,
- * if yes return a new pointer to it, if no allocate a new structure,
- * and register it in the table. In any case a corresponding call to
- * virUnrefDomain() is needed to not leak data.
- *
- * Returns a pointer to the domain, or NULL in case of failure
- */
-virDomainPtr
-__virGetDomain(virConnectPtr conn, const char *name, const unsigned char *uuid) {
- virDomainPtr ret = NULL;
-
- if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) {
- virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return(NULL);
- }
- pthread_mutex_lock(&conn->lock);
-
- /* TODO search by UUID first as they are better differenciators */
-
- ret = (virDomainPtr) virHashLookup(conn->domains, name);
- /* TODO check the UUID */
- if (ret == NULL) {
- if (VIR_ALLOC(ret) < 0) {
- virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating domain"));
- goto error;
- }
- ret->name = strdup(name);
- if (ret->name == NULL) {
- virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating domain"));
- goto error;
- }
- ret->magic = VIR_DOMAIN_MAGIC;
- ret->conn = conn;
- ret->id = -1;
- if (uuid != NULL)
- memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
-
- if (virHashAddEntry(conn->domains, name, ret) < 0) {
- virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("failed to add domain to connection hash table"));
- goto error;
- }
- conn->refs++;
- DEBUG("New hash entry %p", ret);
- } else {
- DEBUG("Existing hash entry %p: refs now %d", ret, ret->refs+1);
- }
- ret->refs++;
- pthread_mutex_unlock(&conn->lock);
- return(ret);
-
- error:
- pthread_mutex_unlock(&conn->lock);
- if (ret != NULL) {
- VIR_FREE(ret->name);
- VIR_FREE(ret);
- }
- return(NULL);
-}
-
-/**
- * virReleaseDomain:
- * @domain: the domain to release
- *
- * Unconditionally release all memory associated with a domain.
- * The conn.lock mutex must be held prior to calling this, and will
- * be released prior to this returning. The domain obj must not
- * be used once this method returns.
- *
- * It will also unreference the associated connection object,
- * which may also be released if its ref count hits zero.
- */
-static void
-virReleaseDomain(virDomainPtr domain) {
- virConnectPtr conn = domain->conn;
- DEBUG("release domain %p %s", domain, domain->name);
-
- /* TODO search by UUID first as they are better differenciators */
- if (virHashRemoveEntry(conn->domains, domain->name, NULL) < 0)
- virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("domain missing from connection hash table"));
-
- if (conn->err.dom == domain)
- conn->err.dom = NULL;
- if (virLastErr.dom == domain)
- virLastErr.dom = NULL;
- domain->magic = -1;
- domain->id = -1;
- VIR_FREE(domain->name);
- VIR_FREE(domain);
-
- DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
- conn->refs--;
- if (conn->refs == 0) {
- virReleaseConnect(conn);
- /* Already unlocked mutex */
- return;
- }
-
- pthread_mutex_unlock(&conn->lock);
-}
-
-
-/**
- * virUnrefDomain:
- * @domain: the domain to unreference
- *
- * Unreference the domain. If the use count drops to zero, the structure is
- * actually freed.
- *
- * Returns the reference count or -1 in case of failure.
- */
-int
-virUnrefDomain(virDomainPtr domain) {
- int refs;
-
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virHashError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return(-1);
- }
- pthread_mutex_lock(&domain->conn->lock);
- DEBUG("unref domain %p %s %d", domain, domain->name, domain->refs);
- domain->refs--;
- refs = domain->refs;
- if (refs == 0) {
- virReleaseDomain(domain);
- /* Already unlocked mutex */
- return (0);
- }
-
- pthread_mutex_unlock(&domain->conn->lock);
- return (refs);
-}
-
-/**
- * virGetNetwork:
- * @conn: the hypervisor connection
- * @name: pointer to the network name
- * @uuid: pointer to the uuid
- *
- * Lookup if the network is already registered for that connection,
- * if yes return a new pointer to it, if no allocate a new structure,
- * and register it in the table. In any case a corresponding call to
- * virUnrefNetwork() is needed to not leak data.
- *
- * Returns a pointer to the network, or NULL in case of failure
- */
-virNetworkPtr
-__virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid) {
- virNetworkPtr ret = NULL;
-
- if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) {
- virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return(NULL);
- }
- pthread_mutex_lock(&conn->lock);
-
- /* TODO search by UUID first as they are better differenciators */
-
- ret = (virNetworkPtr) virHashLookup(conn->networks, name);
- /* TODO check the UUID */
- if (ret == NULL) {
- if (VIR_ALLOC(ret) < 0) {
- virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating network"));
- goto error;
- }
- ret->name = strdup(name);
- if (ret->name == NULL) {
- virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating network"));
- goto error;
- }
- ret->magic = VIR_NETWORK_MAGIC;
- ret->conn = conn;
- if (uuid != NULL)
- memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
-
- if (virHashAddEntry(conn->networks, name, ret) < 0) {
- virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("failed to add network to connection hash table"));
- goto error;
- }
- conn->refs++;
- }
- ret->refs++;
- pthread_mutex_unlock(&conn->lock);
- return(ret);
-
- error:
- pthread_mutex_unlock(&conn->lock);
- if (ret != NULL) {
- VIR_FREE(ret->name);
- VIR_FREE(ret);
- }
- return(NULL);
-}
-
-/**
- * virReleaseNetwork:
- * @network: the network to release
- *
- * Unconditionally release all memory associated with a network.
- * The conn.lock mutex must be held prior to calling this, and will
- * be released prior to this returning. The network obj must not
- * be used once this method returns.
- *
- * It will also unreference the associated connection object,
- * which may also be released if its ref count hits zero.
- */
-static void
-virReleaseNetwork(virNetworkPtr network) {
- virConnectPtr conn = network->conn;
- DEBUG("release network %p %s", network, network->name);
-
- /* TODO search by UUID first as they are better differenciators */
- if (virHashRemoveEntry(conn->networks, network->name, NULL) < 0)
- virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("network missing from connection hash table"));
-
- if (conn->err.net == network)
- conn->err.net = NULL;
- if (virLastErr.net == network)
- virLastErr.net = NULL;
-
- network->magic = -1;
- VIR_FREE(network->name);
- VIR_FREE(network);
-
- DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
- conn->refs--;
- if (conn->refs == 0) {
- virReleaseConnect(conn);
- /* Already unlocked mutex */
- return;
- }
-
- pthread_mutex_unlock(&conn->lock);
-}
-
-
-/**
- * virUnrefNetwork:
- * @network: the network to unreference
- *
- * Unreference the network. If the use count drops to zero, the structure is
- * actually freed.
- *
- * Returns the reference count or -1 in case of failure.
- */
-int
-virUnrefNetwork(virNetworkPtr network) {
- int refs;
-
- if (!VIR_IS_CONNECTED_NETWORK(network)) {
- virHashError(network->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return(-1);
- }
- pthread_mutex_lock(&network->conn->lock);
- DEBUG("unref network %p %s %d", network, network->name, network->refs);
- network->refs--;
- refs = network->refs;
- if (refs == 0) {
- virReleaseNetwork(network);
- /* Already unlocked mutex */
- return (0);
- }
-
- pthread_mutex_unlock(&network->conn->lock);
- return (refs);
-}
-
-
-/**
- * virGetStoragePool:
- * @conn: the hypervisor connection
- * @name: pointer to the storage pool name
- * @uuid: pointer to the uuid
- *
- * Lookup if the storage pool is already registered for that connection,
- * if yes return a new pointer to it, if no allocate a new structure,
- * and register it in the table. In any case a corresponding call to
- * virFreeStoragePool() is needed to not leak data.
- *
- * Returns a pointer to the network, or NULL in case of failure
- */
-virStoragePoolPtr
-__virGetStoragePool(virConnectPtr conn, const char *name, const unsigned char *uuid) {
- virStoragePoolPtr ret = NULL;
-
- if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) {
- virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return(NULL);
- }
- pthread_mutex_lock(&conn->lock);
-
- /* TODO search by UUID first as they are better differenciators */
-
- ret = (virStoragePoolPtr) virHashLookup(conn->storagePools, name);
- /* TODO check the UUID */
- if (ret == NULL) {
- if (VIR_ALLOC(ret) < 0) {
- virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage pool"));
- goto error;
- }
- ret->name = strdup(name);
- if (ret->name == NULL) {
- virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage pool"));
- goto error;
- }
- ret->magic = VIR_STORAGE_POOL_MAGIC;
- ret->conn = conn;
- if (uuid != NULL)
- memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
-
- if (virHashAddEntry(conn->storagePools, name, ret) < 0) {
- virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("failed to add storage pool to connection hash table"));
- goto error;
- }
- conn->refs++;
- }
- ret->refs++;
- pthread_mutex_unlock(&conn->lock);
- return(ret);
-
-error:
- pthread_mutex_unlock(&conn->lock);
- if (ret != NULL) {
- VIR_FREE(ret->name);
- VIR_FREE(ret);
- }
- return(NULL);
-}
-
-
-/**
- * virReleaseStoragePool:
- * @pool: the pool to release
- *
- * Unconditionally release all memory associated with a pool.
- * The conn.lock mutex must be held prior to calling this, and will
- * be released prior to this returning. The pool obj must not
- * be used once this method returns.
- *
- * It will also unreference the associated connection object,
- * which may also be released if its ref count hits zero.
- */
-static void
-virReleaseStoragePool(virStoragePoolPtr pool) {
- virConnectPtr conn = pool->conn;
- DEBUG("release pool %p %s", pool, pool->name);
-
- /* TODO search by UUID first as they are better differenciators */
- if (virHashRemoveEntry(conn->storagePools, pool->name, NULL) < 0)
- virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("pool missing from connection hash table"));
-
- pool->magic = -1;
- VIR_FREE(pool->name);
- VIR_FREE(pool);
-
- DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
- conn->refs--;
- if (conn->refs == 0) {
- virReleaseConnect(conn);
- /* Already unlocked mutex */
- return;
- }
-
- pthread_mutex_unlock(&conn->lock);
-}
-
-
-/**
- * virUnrefStoragePool:
- * @pool: the pool to unreference
- *
- * Unreference the pool. If the use count drops to zero, the structure is
- * actually freed.
- *
- * Returns the reference count or -1 in case of failure.
- */
-int
-virUnrefStoragePool(virStoragePoolPtr pool) {
- int refs;
-
- if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
- virHashError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return(-1);
- }
- pthread_mutex_lock(&pool->conn->lock);
- DEBUG("unref pool %p %s %d", pool, pool->name, pool->refs);
- pool->refs--;
- refs = pool->refs;
- if (refs == 0) {
- virReleaseStoragePool(pool);
- /* Already unlocked mutex */
- return (0);
- }
-
- pthread_mutex_unlock(&pool->conn->lock);
- return (refs);
-}
-
-
-/**
- * virGetStorageVol:
- * @conn: the hypervisor connection
- * @pool: pool owning the volume
- * @name: pointer to the storage vol name
- * @uuid: pointer to the uuid
- *
- * Lookup if the storage vol is already registered for that connection,
- * if yes return a new pointer to it, if no allocate a new structure,
- * and register it in the table. In any case a corresponding call to
- * virFreeStorageVol() is needed to not leak data.
- *
- * Returns a pointer to the storage vol, or NULL in case of failure
- */
-virStorageVolPtr
-__virGetStorageVol(virConnectPtr conn, const char *pool, const char *name, const char *key) {
- virStorageVolPtr ret = NULL;
-
- if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (key == NULL)) {
- virHashError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return(NULL);
- }
- pthread_mutex_lock(&conn->lock);
-
- ret = (virStorageVolPtr) virHashLookup(conn->storageVols, key);
- if (ret == NULL) {
- if (VIR_ALLOC(ret) < 0) {
- virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage vol"));
- goto error;
- }
- ret->pool = strdup(pool);
- if (ret->pool == NULL) {
- virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage vol"));
- goto error;
- }
- ret->name = strdup(name);
- if (ret->name == NULL) {
- virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage vol"));
- goto error;
- }
- strncpy(ret->key, key, sizeof(ret->key)-1);
- ret->key[sizeof(ret->key)-1] = '\0';
- ret->magic = VIR_STORAGE_VOL_MAGIC;
- ret->conn = conn;
-
- if (virHashAddEntry(conn->storageVols, key, ret) < 0) {
- virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("failed to add storage vol to connection hash table"));
- goto error;
- }
- conn->refs++;
- }
- ret->refs++;
- pthread_mutex_unlock(&conn->lock);
- return(ret);
-
-error:
- pthread_mutex_unlock(&conn->lock);
- if (ret != NULL) {
- VIR_FREE(ret->name);
- VIR_FREE(ret->pool);
- VIR_FREE(ret);
- }
- return(NULL);
-}
-
-
-/**
- * virReleaseStorageVol:
- * @vol: the vol to release
- *
- * Unconditionally release all memory associated with a vol.
- * The conn.lock mutex must be held prior to calling this, and will
- * be released prior to this returning. The vol obj must not
- * be used once this method returns.
- *
- * It will also unreference the associated connection object,
- * which may also be released if its ref count hits zero.
- */
-static void
-virReleaseStorageVol(virStorageVolPtr vol) {
- virConnectPtr conn = vol->conn;
- DEBUG("release vol %p %s", vol, vol->name);
-
- /* TODO search by UUID first as they are better differenciators */
- if (virHashRemoveEntry(conn->storageVols, vol->key, NULL) < 0)
- virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- "%s", _("vol missing from connection hash table"));
-
- vol->magic = -1;
- VIR_FREE(vol->name);
- VIR_FREE(vol->pool);
- VIR_FREE(vol);
-
- DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
- conn->refs--;
- if (conn->refs == 0) {
- virReleaseConnect(conn);
- /* Already unlocked mutex */
- return;
- }
-
- pthread_mutex_unlock(&conn->lock);
-}
-
-
-/**
- * virUnrefStorageVol:
- * @vol: the vol to unreference
- *
- * Unreference the vol. If the use count drops to zero, the structure is
- * actually freed.
- *
- * Returns the reference count or -1 in case of failure.
- */
-int
-virUnrefStorageVol(virStorageVolPtr vol) {
- int refs;
-
- if (!VIR_IS_CONNECTED_STORAGE_VOL(vol)) {
- virHashError(vol->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return(-1);
- }
- pthread_mutex_lock(&vol->conn->lock);
- DEBUG("unref vol %p %s %d", vol, vol->name, vol->refs);
- vol->refs--;
- refs = vol->refs;
- if (refs == 0) {
- virReleaseStorageVol(vol);
- /* Already unlocked mutex */
- return (0);
- }
-
- pthread_mutex_unlock(&vol->conn->lock);
- return (refs);
-}
diff -r ef2d00e6bc78 src/internal.h
--- a/src/internal.h Wed Oct 29 11:36:21 2008 +0000
+++ b/src/internal.h Wed Oct 29 11:48:08 2008 +0000
@@ -295,58 +295,6 @@
};
-
-/************************************************************************
- * *
- * API for domain/connections (de)allocations and lookups *
- * *
- ************************************************************************/
-
-virConnectPtr virGetConnect (void);
-int virUnrefConnect (virConnectPtr conn);
-virDomainPtr __virGetDomain (virConnectPtr conn,
- const char *name,
- const unsigned char *uuid);
-int virUnrefDomain (virDomainPtr domain);
-virNetworkPtr __virGetNetwork (virConnectPtr conn,
- const char *name,
- const unsigned char *uuid);
-int virUnrefNetwork (virNetworkPtr network);
-
-virStoragePoolPtr __virGetStoragePool (virConnectPtr conn,
- const char *name,
- const unsigned char *uuid);
-int virUnrefStoragePool (virStoragePoolPtr pool);
-virStorageVolPtr __virGetStorageVol (virConnectPtr conn,
- const char *pool,
- const char *name,
- const char *key);
-int virUnrefStorageVol (virStorageVolPtr vol);
-
-#define virGetDomain(c,n,u) __virGetDomain((c),(n),(u))
-#define virGetNetwork(c,n,u) __virGetNetwork((c),(n),(u))
-#define virGetStoragePool(c,n,u) __virGetStoragePool((c),(n),(u))
-#define virGetStorageVol(c,p,n,u) __virGetStorageVol((c),(p),(n),(u))
-
-#ifdef WITH_LIBVIRTD
-int __virStateInitialize(void);
-int __virStateCleanup(void);
-int __virStateReload(void);
-int __virStateActive(void);
-int __virStateSigDispatcher(siginfo_t *siginfo);
-#define virStateInitialize() __virStateInitialize()
-#define virStateCleanup() __virStateCleanup()
-#define virStateReload() __virStateReload()
-#define virStateActive() __virStateActive()
-#define virStateSigDispatcher(s) __virStateSigDispatcher(s)
-#endif
-
-int __virDrvSupportsFeature (virConnectPtr conn, int feature);
-
-int __virDomainMigratePrepare (virConnectPtr dconn, char **cookie, int *cookielen, const char *uri_in, char **uri_out, unsigned long flags, const char *dname, unsigned long bandwidth);
-int __virDomainMigratePerform (virDomainPtr domain, const char *cookie, int cookielen, const char *uri, unsigned long flags, const char *dname, unsigned long bandwidth);
-virDomainPtr __virDomainMigrateFinish (virConnectPtr dconn, const char *dname, const char *cookie, int cookielen, const char *uri, unsigned long flags);
-
/**
* Domain Event Notification
*/
diff -r ef2d00e6bc78 src/libvirt.c
--- a/src/libvirt.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/libvirt.c Wed Oct 29 11:48:08 2008 +0000
@@ -32,6 +32,7 @@
#endif
#include "virterror.h"
+#include "libvirt.h"
#include "driver.h"
#include "uuid.h"
@@ -5570,3 +5571,730 @@
return 0;
}
+
+
+/************************************************************************
+ * *
+ * Domain and Connections allocations *
+ * *
+ ************************************************************************/
+
+/**
+ * virDomainFreeName:
+ * @domain: a domain object
+ *
+ * Destroy the domain object, this is just used by the domain hash callback.
+ *
+ * Returns 0 in case of success and -1 in case of failure.
+ */
+static int
+virDomainFreeName(virDomainPtr domain, const char *name ATTRIBUTE_UNUSED)
+{
+ return (virDomainFree(domain));
+}
+
+/**
+ * virNetworkFreeName:
+ * @network: a network object
+ *
+ * Destroy the network object, this is just used by the network hash callback.
+ *
+ * Returns 0 in case of success and -1 in case of failure.
+ */
+static int
+virNetworkFreeName(virNetworkPtr network, const char *name ATTRIBUTE_UNUSED)
+{
+ return (virNetworkFree(network));
+}
+
+/**
+ * virStoragePoolFreeName:
+ * @pool: a pool object
+ *
+ * Destroy the pool object, this is just used by the pool hash callback.
+ *
+ * Returns 0 in case of success and -1 in case of failure.
+ */
+static int
+virStoragePoolFreeName(virStoragePoolPtr pool, const char *name ATTRIBUTE_UNUSED)
+{
+ return (virStoragePoolFree(pool));
+}
+
+/**
+ * virStorageVolFreeName:
+ * @vol: a vol object
+ *
+ * Destroy the vol object, this is just used by the vol hash callback.
+ *
+ * Returns 0 in case of success and -1 in case of failure.
+ */
+static int
+virStorageVolFreeName(virStorageVolPtr vol, const char *name ATTRIBUTE_UNUSED)
+{
+ return (virStorageVolFree(vol));
+}
+
+/**
+ * virGetConnect:
+ *
+ * Allocates a new hypervisor connection structure
+ *
+ * Returns a new pointer or NULL in case of error.
+ */
+virConnectPtr
+virGetConnect(void) {
+ virConnectPtr ret;
+
+ if (VIR_ALLOC(ret) < 0) {
+ virLibConnError(NULL, VIR_ERR_NO_MEMORY, _("allocating connection"));
+ goto failed;
+ }
+ ret->magic = VIR_CONNECT_MAGIC;
+ ret->driver = NULL;
+ ret->networkDriver = NULL;
+ ret->privateData = NULL;
+ ret->networkPrivateData = NULL;
+ ret->domains = virHashCreate(20);
+ if (ret->domains == NULL)
+ goto failed;
+ ret->networks = virHashCreate(20);
+ if (ret->networks == NULL)
+ goto failed;
+ ret->storagePools = virHashCreate(20);
+ if (ret->storagePools == NULL)
+ goto failed;
+ ret->storageVols = virHashCreate(20);
+ if (ret->storageVols == NULL)
+ goto failed;
+
+ pthread_mutex_init(&ret->lock, NULL);
+
+ ret->refs = 1;
+ return(ret);
+
+failed:
+ if (ret != NULL) {
+ if (ret->domains != NULL)
+ virHashFree(ret->domains, (virHashDeallocator) virDomainFreeName);
+ if (ret->networks != NULL)
+ virHashFree(ret->networks, (virHashDeallocator) virNetworkFreeName);
+ if (ret->storagePools != NULL)
+ virHashFree(ret->storagePools, (virHashDeallocator) virStoragePoolFreeName);
+ if (ret->storageVols != NULL)
+ virHashFree(ret->storageVols, (virHashDeallocator) virStorageVolFreeName);
+
+ pthread_mutex_destroy(&ret->lock);
+ VIR_FREE(ret);
+ }
+ return(NULL);
+}
+
+/**
+ * virReleaseConnect:
+ * @conn: the hypervisor connection to release
+ *
+ * Unconditionally release all memory associated with a connection.
+ * The conn.lock mutex must be held prior to calling this, and will
+ * be released prior to this returning. The connection obj must not
+ * be used once this method returns.
+ */
+static void
+virReleaseConnect(virConnectPtr conn) {
+ DEBUG("release connection %p %s", conn, conn->name);
+ if (conn->domains != NULL)
+ virHashFree(conn->domains, (virHashDeallocator) virDomainFreeName);
+ if (conn->networks != NULL)
+ virHashFree(conn->networks, (virHashDeallocator) virNetworkFreeName);
+ if (conn->storagePools != NULL)
+ virHashFree(conn->storagePools, (virHashDeallocator) virStoragePoolFreeName);
+ if (conn->storageVols != NULL)
+ virHashFree(conn->storageVols, (virHashDeallocator) virStorageVolFreeName);
+
+ virResetError(&conn->err);
+ if (virLastErr.conn == conn)
+ virLastErr.conn = NULL;
+
+ VIR_FREE(conn->name);
+
+ pthread_mutex_unlock(&conn->lock);
+ pthread_mutex_destroy(&conn->lock);
+ VIR_FREE(conn);
+}
+
+/**
+ * virUnrefConnect:
+ * @conn: the hypervisor connection to unreference
+ *
+ * Unreference the connection. If the use count drops to zero, the structure is
+ * actually freed.
+ *
+ * Returns the reference count or -1 in case of failure.
+ */
+int
+virUnrefConnect(virConnectPtr conn) {
+ int refs;
+
+ if ((!VIR_IS_CONNECT(conn))) {
+ virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return(-1);
+ }
+ pthread_mutex_lock(&conn->lock);
+ DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
+ conn->refs--;
+ refs = conn->refs;
+ if (refs == 0) {
+ virReleaseConnect(conn);
+ /* Already unlocked mutex */
+ return (0);
+ }
+ pthread_mutex_unlock(&conn->lock);
+ return (refs);
+}
+
+/**
+ * virGetDomain:
+ * @conn: the hypervisor connection
+ * @name: pointer to the domain name
+ * @uuid: pointer to the uuid
+ *
+ * Lookup if the domain is already registered for that connection,
+ * if yes return a new pointer to it, if no allocate a new structure,
+ * and register it in the table. In any case a corresponding call to
+ * virUnrefDomain() is needed to not leak data.
+ *
+ * Returns a pointer to the domain, or NULL in case of failure
+ */
+virDomainPtr
+__virGetDomain(virConnectPtr conn, const char *name, const unsigned char *uuid) {
+ virDomainPtr ret = NULL;
+
+ if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) {
+ virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return(NULL);
+ }
+ pthread_mutex_lock(&conn->lock);
+
+ /* TODO search by UUID first as they are better differenciators */
+
+ ret = (virDomainPtr) virHashLookup(conn->domains, name);
+ /* TODO check the UUID */
+ if (ret == NULL) {
+ if (VIR_ALLOC(ret) < 0) {
+ virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
+ goto error;
+ }
+ ret->name = strdup(name);
+ if (ret->name == NULL) {
+ virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
+ goto error;
+ }
+ ret->magic = VIR_DOMAIN_MAGIC;
+ ret->conn = conn;
+ ret->id = -1;
+ if (uuid != NULL)
+ memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
+
+ if (virHashAddEntry(conn->domains, name, ret) < 0) {
+ virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("failed to add domain to connection hash table"));
+ goto error;
+ }
+ conn->refs++;
+ DEBUG("New hash entry %p", ret);
+ } else {
+ DEBUG("Existing hash entry %p: refs now %d", ret, ret->refs+1);
+ }
+ ret->refs++;
+ pthread_mutex_unlock(&conn->lock);
+ return(ret);
+
+ error:
+ pthread_mutex_unlock(&conn->lock);
+ if (ret != NULL) {
+ VIR_FREE(ret->name);
+ VIR_FREE(ret);
+ }
+ return(NULL);
+}
+
+/**
+ * virReleaseDomain:
+ * @domain: the domain to release
+ *
+ * Unconditionally release all memory associated with a domain.
+ * The conn.lock mutex must be held prior to calling this, and will
+ * be released prior to this returning. The domain obj must not
+ * be used once this method returns.
+ *
+ * It will also unreference the associated connection object,
+ * which may also be released if its ref count hits zero.
+ */
+static void
+virReleaseDomain(virDomainPtr domain) {
+ virConnectPtr conn = domain->conn;
+ DEBUG("release domain %p %s", domain, domain->name);
+
+ /* TODO search by UUID first as they are better differenciators */
+ if (virHashRemoveEntry(conn->domains, domain->name, NULL) < 0)
+ virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("domain missing from connection hash table"));
+
+ if (conn->err.dom == domain)
+ conn->err.dom = NULL;
+ if (virLastErr.dom == domain)
+ virLastErr.dom = NULL;
+ domain->magic = -1;
+ domain->id = -1;
+ VIR_FREE(domain->name);
+ VIR_FREE(domain);
+
+ DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
+ conn->refs--;
+ if (conn->refs == 0) {
+ virReleaseConnect(conn);
+ /* Already unlocked mutex */
+ return;
+ }
+
+ pthread_mutex_unlock(&conn->lock);
+}
+
+
+/**
+ * virUnrefDomain:
+ * @domain: the domain to unreference
+ *
+ * Unreference the domain. If the use count drops to zero, the structure is
+ * actually freed.
+ *
+ * Returns the reference count or -1 in case of failure.
+ */
+int
+virUnrefDomain(virDomainPtr domain) {
+ int refs;
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibConnError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return(-1);
+ }
+ pthread_mutex_lock(&domain->conn->lock);
+ DEBUG("unref domain %p %s %d", domain, domain->name, domain->refs);
+ domain->refs--;
+ refs = domain->refs;
+ if (refs == 0) {
+ virReleaseDomain(domain);
+ /* Already unlocked mutex */
+ return (0);
+ }
+
+ pthread_mutex_unlock(&domain->conn->lock);
+ return (refs);
+}
+
+/**
+ * virGetNetwork:
+ * @conn: the hypervisor connection
+ * @name: pointer to the network name
+ * @uuid: pointer to the uuid
+ *
+ * Lookup if the network is already registered for that connection,
+ * if yes return a new pointer to it, if no allocate a new structure,
+ * and register it in the table. In any case a corresponding call to
+ * virUnrefNetwork() is needed to not leak data.
+ *
+ * Returns a pointer to the network, or NULL in case of failure
+ */
+virNetworkPtr
+__virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid) {
+ virNetworkPtr ret = NULL;
+
+ if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) {
+ virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return(NULL);
+ }
+ pthread_mutex_lock(&conn->lock);
+
+ /* TODO search by UUID first as they are better differenciators */
+
+ ret = (virNetworkPtr) virHashLookup(conn->networks, name);
+ /* TODO check the UUID */
+ if (ret == NULL) {
+ if (VIR_ALLOC(ret) < 0) {
+ virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating network"));
+ goto error;
+ }
+ ret->name = strdup(name);
+ if (ret->name == NULL) {
+ virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating network"));
+ goto error;
+ }
+ ret->magic = VIR_NETWORK_MAGIC;
+ ret->conn = conn;
+ if (uuid != NULL)
+ memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
+
+ if (virHashAddEntry(conn->networks, name, ret) < 0) {
+ virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("failed to add network to connection hash table"));
+ goto error;
+ }
+ conn->refs++;
+ }
+ ret->refs++;
+ pthread_mutex_unlock(&conn->lock);
+ return(ret);
+
+ error:
+ pthread_mutex_unlock(&conn->lock);
+ if (ret != NULL) {
+ VIR_FREE(ret->name);
+ VIR_FREE(ret);
+ }
+ return(NULL);
+}
+
+/**
+ * virReleaseNetwork:
+ * @network: the network to release
+ *
+ * Unconditionally release all memory associated with a network.
+ * The conn.lock mutex must be held prior to calling this, and will
+ * be released prior to this returning. The network obj must not
+ * be used once this method returns.
+ *
+ * It will also unreference the associated connection object,
+ * which may also be released if its ref count hits zero.
+ */
+static void
+virReleaseNetwork(virNetworkPtr network) {
+ virConnectPtr conn = network->conn;
+ DEBUG("release network %p %s", network, network->name);
+
+ /* TODO search by UUID first as they are better differenciators */
+ if (virHashRemoveEntry(conn->networks, network->name, NULL) < 0)
+ virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("network missing from connection hash table"));
+
+ if (conn->err.net == network)
+ conn->err.net = NULL;
+ if (virLastErr.net == network)
+ virLastErr.net = NULL;
+
+ network->magic = -1;
+ VIR_FREE(network->name);
+ VIR_FREE(network);
+
+ DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
+ conn->refs--;
+ if (conn->refs == 0) {
+ virReleaseConnect(conn);
+ /* Already unlocked mutex */
+ return;
+ }
+
+ pthread_mutex_unlock(&conn->lock);
+}
+
+
+/**
+ * virUnrefNetwork:
+ * @network: the network to unreference
+ *
+ * Unreference the network. If the use count drops to zero, the structure is
+ * actually freed.
+ *
+ * Returns the reference count or -1 in case of failure.
+ */
+int
+virUnrefNetwork(virNetworkPtr network) {
+ int refs;
+
+ if (!VIR_IS_CONNECTED_NETWORK(network)) {
+ virLibConnError(network->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return(-1);
+ }
+ pthread_mutex_lock(&network->conn->lock);
+ DEBUG("unref network %p %s %d", network, network->name, network->refs);
+ network->refs--;
+ refs = network->refs;
+ if (refs == 0) {
+ virReleaseNetwork(network);
+ /* Already unlocked mutex */
+ return (0);
+ }
+
+ pthread_mutex_unlock(&network->conn->lock);
+ return (refs);
+}
+
+
+/**
+ * virGetStoragePool:
+ * @conn: the hypervisor connection
+ * @name: pointer to the storage pool name
+ * @uuid: pointer to the uuid
+ *
+ * Lookup if the storage pool is already registered for that connection,
+ * if yes return a new pointer to it, if no allocate a new structure,
+ * and register it in the table. In any case a corresponding call to
+ * virFreeStoragePool() is needed to not leak data.
+ *
+ * Returns a pointer to the network, or NULL in case of failure
+ */
+virStoragePoolPtr
+__virGetStoragePool(virConnectPtr conn, const char *name, const unsigned char *uuid) {
+ virStoragePoolPtr ret = NULL;
+
+ if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (uuid == NULL)) {
+ virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return(NULL);
+ }
+ pthread_mutex_lock(&conn->lock);
+
+ /* TODO search by UUID first as they are better differenciators */
+
+ ret = (virStoragePoolPtr) virHashLookup(conn->storagePools, name);
+ /* TODO check the UUID */
+ if (ret == NULL) {
+ if (VIR_ALLOC(ret) < 0) {
+ virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating storage pool"));
+ goto error;
+ }
+ ret->name = strdup(name);
+ if (ret->name == NULL) {
+ virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating storage pool"));
+ goto error;
+ }
+ ret->magic = VIR_STORAGE_POOL_MAGIC;
+ ret->conn = conn;
+ if (uuid != NULL)
+ memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
+
+ if (virHashAddEntry(conn->storagePools, name, ret) < 0) {
+ virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("failed to add storage pool to connection hash table"));
+ goto error;
+ }
+ conn->refs++;
+ }
+ ret->refs++;
+ pthread_mutex_unlock(&conn->lock);
+ return(ret);
+
+error:
+ pthread_mutex_unlock(&conn->lock);
+ if (ret != NULL) {
+ VIR_FREE(ret->name);
+ VIR_FREE(ret);
+ }
+ return(NULL);
+}
+
+
+/**
+ * virReleaseStoragePool:
+ * @pool: the pool to release
+ *
+ * Unconditionally release all memory associated with a pool.
+ * The conn.lock mutex must be held prior to calling this, and will
+ * be released prior to this returning. The pool obj must not
+ * be used once this method returns.
+ *
+ * It will also unreference the associated connection object,
+ * which may also be released if its ref count hits zero.
+ */
+static void
+virReleaseStoragePool(virStoragePoolPtr pool) {
+ virConnectPtr conn = pool->conn;
+ DEBUG("release pool %p %s", pool, pool->name);
+
+ /* TODO search by UUID first as they are better differenciators */
+ if (virHashRemoveEntry(conn->storagePools, pool->name, NULL) < 0)
+ virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("pool missing from connection hash table"));
+
+ pool->magic = -1;
+ VIR_FREE(pool->name);
+ VIR_FREE(pool);
+
+ DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
+ conn->refs--;
+ if (conn->refs == 0) {
+ virReleaseConnect(conn);
+ /* Already unlocked mutex */
+ return;
+ }
+
+ pthread_mutex_unlock(&conn->lock);
+}
+
+
+/**
+ * virUnrefStoragePool:
+ * @pool: the pool to unreference
+ *
+ * Unreference the pool. If the use count drops to zero, the structure is
+ * actually freed.
+ *
+ * Returns the reference count or -1 in case of failure.
+ */
+int
+virUnrefStoragePool(virStoragePoolPtr pool) {
+ int refs;
+
+ if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
+ virLibConnError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return(-1);
+ }
+ pthread_mutex_lock(&pool->conn->lock);
+ DEBUG("unref pool %p %s %d", pool, pool->name, pool->refs);
+ pool->refs--;
+ refs = pool->refs;
+ if (refs == 0) {
+ virReleaseStoragePool(pool);
+ /* Already unlocked mutex */
+ return (0);
+ }
+
+ pthread_mutex_unlock(&pool->conn->lock);
+ return (refs);
+}
+
+
+/**
+ * virGetStorageVol:
+ * @conn: the hypervisor connection
+ * @pool: pool owning the volume
+ * @name: pointer to the storage vol name
+ * @uuid: pointer to the uuid
+ *
+ * Lookup if the storage vol is already registered for that connection,
+ * if yes return a new pointer to it, if no allocate a new structure,
+ * and register it in the table. In any case a corresponding call to
+ * virFreeStorageVol() is needed to not leak data.
+ *
+ * Returns a pointer to the storage vol, or NULL in case of failure
+ */
+virStorageVolPtr
+__virGetStorageVol(virConnectPtr conn, const char *pool, const char *name, const char *key) {
+ virStorageVolPtr ret = NULL;
+
+ if ((!VIR_IS_CONNECT(conn)) || (name == NULL) || (key == NULL)) {
+ virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return(NULL);
+ }
+ pthread_mutex_lock(&conn->lock);
+
+ ret = (virStorageVolPtr) virHashLookup(conn->storageVols, key);
+ if (ret == NULL) {
+ if (VIR_ALLOC(ret) < 0) {
+ virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating storage vol"));
+ goto error;
+ }
+ ret->pool = strdup(pool);
+ if (ret->pool == NULL) {
+ virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating storage vol"));
+ goto error;
+ }
+ ret->name = strdup(name);
+ if (ret->name == NULL) {
+ virLibConnError(conn, VIR_ERR_NO_MEMORY, _("allocating storage vol"));
+ goto error;
+ }
+ strncpy(ret->key, key, sizeof(ret->key)-1);
+ ret->key[sizeof(ret->key)-1] = '\0';
+ ret->magic = VIR_STORAGE_VOL_MAGIC;
+ ret->conn = conn;
+
+ if (virHashAddEntry(conn->storageVols, key, ret) < 0) {
+ virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("failed to add storage vol to connection hash table"));
+ goto error;
+ }
+ conn->refs++;
+ }
+ ret->refs++;
+ pthread_mutex_unlock(&conn->lock);
+ return(ret);
+
+error:
+ pthread_mutex_unlock(&conn->lock);
+ if (ret != NULL) {
+ VIR_FREE(ret->name);
+ VIR_FREE(ret->pool);
+ VIR_FREE(ret);
+ }
+ return(NULL);
+}
+
+
+/**
+ * virReleaseStorageVol:
+ * @vol: the vol to release
+ *
+ * Unconditionally release all memory associated with a vol.
+ * The conn.lock mutex must be held prior to calling this, and will
+ * be released prior to this returning. The vol obj must not
+ * be used once this method returns.
+ *
+ * It will also unreference the associated connection object,
+ * which may also be released if its ref count hits zero.
+ */
+static void
+virReleaseStorageVol(virStorageVolPtr vol) {
+ virConnectPtr conn = vol->conn;
+ DEBUG("release vol %p %s", vol, vol->name);
+
+ /* TODO search by UUID first as they are better differenciators */
+ if (virHashRemoveEntry(conn->storageVols, vol->key, NULL) < 0)
+ virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("vol missing from connection hash table"));
+
+ vol->magic = -1;
+ VIR_FREE(vol->name);
+ VIR_FREE(vol->pool);
+ VIR_FREE(vol);
+
+ DEBUG("unref connection %p %s %d", conn, conn->name, conn->refs);
+ conn->refs--;
+ if (conn->refs == 0) {
+ virReleaseConnect(conn);
+ /* Already unlocked mutex */
+ return;
+ }
+
+ pthread_mutex_unlock(&conn->lock);
+}
+
+
+/**
+ * virUnrefStorageVol:
+ * @vol: the vol to unreference
+ *
+ * Unreference the vol. If the use count drops to zero, the structure is
+ * actually freed.
+ *
+ * Returns the reference count or -1 in case of failure.
+ */
+int
+virUnrefStorageVol(virStorageVolPtr vol) {
+ int refs;
+
+ if (!VIR_IS_CONNECTED_STORAGE_VOL(vol)) {
+ virLibConnError(vol->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return(-1);
+ }
+ pthread_mutex_lock(&vol->conn->lock);
+ DEBUG("unref vol %p %s %d", vol, vol->name, vol->refs);
+ vol->refs--;
+ refs = vol->refs;
+ if (refs == 0) {
+ virReleaseStorageVol(vol);
+ /* Already unlocked mutex */
+ return (0);
+ }
+
+ pthread_mutex_unlock(&vol->conn->lock);
+ return (refs);
+}
diff -r ef2d00e6bc78 src/libvirt.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/libvirt.h Wed Oct 29 11:48:08 2008 +0000
@@ -0,0 +1,98 @@
+/*
+ * libvirt.h: publically exported APIs, not for public use
+ *
+ * Copyright (C) 2006-2008 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef __LIBVIRT_H_
+#define __LIBVIRT_H_
+
+#include "internal.h"
+
+
+/************************************************************************
+ * *
+ * API for domain/connections (de)allocations and lookups *
+ * *
+ ************************************************************************/
+
+virConnectPtr virGetConnect(void);
+int virUnrefConnect(virConnectPtr conn);
+virDomainPtr __virGetDomain(virConnectPtr conn,
+ const char *name,
+ const unsigned char *uuid);
+int virUnrefDomain(virDomainPtr domain);
+virNetworkPtr __virGetNetwork(virConnectPtr conn,
+ const char *name,
+ const unsigned char *uuid);
+int virUnrefNetwork(virNetworkPtr network);
+
+virStoragePoolPtr __virGetStoragePool(virConnectPtr conn,
+ const char *name,
+ const unsigned char *uuid);
+int virUnrefStoragePool(virStoragePoolPtr pool);
+virStorageVolPtr __virGetStorageVol(virConnectPtr conn,
+ const char *pool,
+ const char *name,
+ const char *key);
+int virUnrefStorageVol(virStorageVolPtr vol);
+
+#define virGetDomain(c,n,u) __virGetDomain((c),(n),(u))
+#define virGetNetwork(c,n,u) __virGetNetwork((c),(n),(u))
+#define virGetStoragePool(c,n,u) __virGetStoragePool((c),(n),(u))
+#define virGetStorageVol(c,p,n,u) __virGetStorageVol((c),(p),(n),(u))
+
+#ifdef WITH_LIBVIRTD
+int __virStateInitialize(void);
+int __virStateCleanup(void);
+int __virStateReload(void);
+int __virStateActive(void);
+int __virStateSigDispatcher(siginfo_t *siginfo);
+#define virStateInitialize() __virStateInitialize()
+#define virStateCleanup() __virStateCleanup()
+#define virStateReload() __virStateReload()
+#define virStateActive() __virStateActive()
+#define virStateSigDispatcher(s) __virStateSigDispatcher(s)
+#endif
+
+int __virDrvSupportsFeature (virConnectPtr conn, int feature);
+
+int __virDomainMigratePrepare (virConnectPtr dconn,
+ char **cookie,
+ int *cookielen,
+ const char *uri_in,
+ char **uri_out,
+ unsigned long flags,
+ const char *dname,
+ unsigned long bandwidth);
+int __virDomainMigratePerform (virDomainPtr domain,
+ const char *cookie,
+ int cookielen,
+ const char *uri,
+ unsigned long flags,
+ const char *dname,
+ unsigned long bandwidth);
+virDomainPtr __virDomainMigrateFinish (virConnectPtr dconn,
+ const char *dname,
+ const char *cookie,
+ int cookielen,
+ const char *uri,
+ unsigned long flags);
+
+
+#endif
diff -r ef2d00e6bc78 src/lxc_driver.c
--- a/src/lxc_driver.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/lxc_driver.c Wed Oct 29 11:48:08 2008 +0000
@@ -36,6 +36,7 @@
#include <wait.h>
#include "virterror.h"
+#include "libvirt.h"
#include "lxc_conf.h"
#include "lxc_container.h"
#include "lxc_driver.h"
diff -r ef2d00e6bc78 src/network_driver.c
--- a/src/network_driver.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/network_driver.c Wed Oct 29 11:48:08 2008 +0000
@@ -45,6 +45,7 @@
#include <sys/ioctl.h>
#include "virterror.h"
+#include "libvirt.h"
#include "network_driver.h"
#include "network_conf.h"
#include "driver.h"
diff -r ef2d00e6bc78 src/openvz_driver.c
--- a/src/openvz_driver.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/openvz_driver.c Wed Oct 29 11:48:08 2008 +0000
@@ -48,6 +48,7 @@
#include <sys/wait.h>
#include "virterror.h"
+#include "libvirt.h"
#include "openvz_driver.h"
#include "event.h"
#include "buf.h"
diff -r ef2d00e6bc78 src/proxy_internal.h
--- a/src/proxy_internal.h Wed Oct 29 11:36:21 2008 +0000
+++ b/src/proxy_internal.h Wed Oct 29 11:48:08 2008 +0000
@@ -12,7 +12,8 @@
#ifndef __LIBVIR_PROXY_H__
#define __LIBVIR_PROXY_H__
-#include "libvirt/libvirt.h"
+#include "internal.h"
+#include "libvirt.h"
#define PROXY_SOCKET_PATH "/tmp/livirt_proxy_conn"
#define PROXY_PROTO_VERSION 1
diff -r ef2d00e6bc78 src/qemu_driver.c
--- a/src/qemu_driver.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/qemu_driver.c Wed Oct 29 11:48:08 2008 +0000
@@ -53,6 +53,7 @@
#endif
#include "virterror.h"
+#include "libvirt.h"
#include "qemu_driver.h"
#include "qemu_conf.h"
#include "c-ctype.h"
diff -r ef2d00e6bc78 src/remote_internal.c
--- a/src/remote_internal.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/remote_internal.c Wed Oct 29 11:48:08 2008 +0000
@@ -74,6 +74,7 @@
#endif
#include "virterror.h"
+#include "libvirt.h"
#include "driver.h"
#include "buf.h"
#include "qparams.h"
diff -r ef2d00e6bc78 src/storage_driver.c
--- a/src/storage_driver.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/storage_driver.c Wed Oct 29 11:48:08 2008 +0000
@@ -33,6 +33,7 @@
#include <string.h>
#include "virterror.h"
+#include "libvirt.h"
#include "driver.h"
#include "util.h"
#include "storage_driver.h"
diff -r ef2d00e6bc78 src/test.c
--- a/src/test.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/test.c Wed Oct 29 11:48:08 2008 +0000
@@ -32,6 +32,7 @@
#include "virterror.h"
+#include "libvirt.h"
#include "test.h"
#include "buf.h"
#include "util.h"
diff -r ef2d00e6bc78 src/xen_internal.c
--- a/src/xen_internal.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/xen_internal.c Wed Oct 29 11:48:08 2008 +0000
@@ -41,6 +41,7 @@
#include <xen/sched.h>
#include "virterror.h"
+#include "libvirt.h"
#include "driver.h"
#include "util.h"
#include "xen_unified.h"
diff -r ef2d00e6bc78 src/xend_internal.c
--- a/src/xend_internal.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/xend_internal.c Wed Oct 29 11:48:08 2008 +0000
@@ -33,6 +33,7 @@
#include <errno.h>
#include "virterror.h"
+#include "libvirt.h"
#include "xend_internal.h"
#include "driver.h"
#include "util.h"
diff -r ef2d00e6bc78 src/xm_internal.c
--- a/src/xm_internal.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/xm_internal.c Wed Oct 29 11:48:08 2008 +0000
@@ -36,6 +36,7 @@
#include <xen/dom0_ops.h>
#include "virterror.h"
+#include "libvirt.h"
#include "xm_internal.h"
#include "xen_unified.h"
#include "xend_internal.h"
diff -r ef2d00e6bc78 src/xs_internal.c
--- a/src/xs_internal.c Wed Oct 29 11:36:21 2008 +0000
+++ b/src/xs_internal.c Wed Oct 29 11:48:08 2008 +0000
@@ -27,6 +27,7 @@
#include <xs.h>
#include "virterror.h"
+#include "libvirt.h"
#include "driver.h"
#include "xen_unified.h"
#include "xs_internal.h"
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
3
3
[libvirt] PATCH: Remove virStringList & improve virStoragePoolSourceList
by Daniel P. Berrange 29 Oct '08
by Daniel P. Berrange 29 Oct '08
29 Oct '08
Chris' recent patch removed use of the virStringList for the LVM discovery,
but it was still used in the NFS discovery code. I figured we might as well
make NFS discovery use virStoragePoolSourceList() too. This require a few
changes:
- Include pool type in virStoragePoolSourceList so XML formatter knows
what type of source information is available
- Factor out code to format a single virStoragePoolSourcePtr object
into a virStoragePoolSourceFormat method
- Make virStoragePoolDefFormat & virStoragePoolListFormat both call
this common method
- Make LVM discovery code set the pool type in source list
- Switch NFS discovery to use virStoragePoolSourceList
This also has benfit of giving proper indentation in the XML
# ./virsh find-storage-pool-sources-as logical
<sources>
<source>
<device path='/dev/sda2'/>
<name>HostVG</name>
<format type='lvm2'/>
</source>
</sources>
# ./virsh find-storage-pool-sources-as --host aubergine.redhat.com netfs
<sources>
<source>
<host name='aubergine.redhat.com'/>
<dir path='/mnt/export'/>
<format type='nfs'/>
</source>
<source>
<host name='aubergine.redhat.com'/>
<dir path='/home'/>
<format type='nfs'/>
</source>
</sources>
internal.h | 12 ---
libvirt.c | 40 ------------
storage_backend_fs.c | 46 +++++++-------
storage_backend_logical.c | 3
storage_conf.c | 150 +++++++++++++++++++++++++++-------------------
storage_conf.h | 1
6 files changed, 120 insertions(+), 132 deletions(-)
Daniel
diff -r 32908ef883dc src/internal.h
--- a/src/internal.h Wed Oct 29 11:26:37 2008 +0000
+++ b/src/internal.h Wed Oct 29 11:29:16 2008 +0000
@@ -371,18 +371,6 @@
int __virDomainMigratePerform (virDomainPtr domain, const char *cookie, int cookielen, const char *uri, unsigned long flags, const char *dname, unsigned long bandwidth);
virDomainPtr __virDomainMigrateFinish (virConnectPtr dconn, const char *dname, const char *cookie, int cookielen, const char *uri, unsigned long flags);
-typedef struct _virStringList virStringList;
-
-struct _virStringList {
- char *val;
- int len;
- struct _virStringList *next;
-};
-
-char *__virStringListJoin(const virStringList *list, const char *pre,
- const char *post, const char *sep);
-void __virStringListFree(virStringList *list);
-
/**
* Domain Event Notification
*/
diff -r 32908ef883dc src/libvirt.c
--- a/src/libvirt.c Wed Oct 29 11:26:37 2008 +0000
+++ b/src/libvirt.c Wed Oct 29 11:29:16 2008 +0000
@@ -5305,46 +5305,6 @@
-
-/* Not for public use. Combines the elements of a virStringList
- * into a single string.
- */
-char *__virStringListJoin(const virStringList *list, const char *pre,
- const char *post, const char *sep)
-{
- size_t pre_len = strlen(pre);
- size_t sep_len = strlen(sep);
- size_t len = pre_len + strlen(post);
- const virStringList *p;
- char *retval;
-
- for (p = list; p; p = p->next)
- len += p->len + sep_len;
- if (VIR_ALLOC_N(retval, len+1) < 0)
- return NULL;
- strcpy(retval, pre);
- len = pre_len;
- for (p = list; p; p = p->next) {
- strcpy(retval + len, p->val);
- len += p->len;
- strcpy(retval + len, sep);
- len += sep_len;
- }
- strcpy(retval + len, post);
-
- return retval;
-}
-
-
-void __virStringListFree(virStringList *list)
-{
- while (list) {
- virStringList *p = list->next;
- VIR_FREE(list);
- list = p;
- }
-}
-
/*
* Domain Event Notification
*/
diff -r 32908ef883dc src/storage_backend_fs.c
--- a/src/storage_backend_fs.c Wed Oct 29 11:26:37 2008 +0000
+++ b/src/storage_backend_fs.c Wed Oct 29 11:29:16 2008 +0000
@@ -295,7 +295,7 @@
#if WITH_STORAGE_FS
struct _virNetfsDiscoverState {
const char *host;
- virStringList *list;
+ virStoragePoolSourceList list;
};
typedef struct _virNetfsDiscoverState virNetfsDiscoverState;
@@ -307,8 +307,8 @@
void *data)
{
virNetfsDiscoverState *state = data;
- virStringList *newItem;
const char *name, *path;
+ virStoragePoolSource *src;
path = groups[0];
@@ -325,24 +325,17 @@
return -1;
}
- /* Append new XML desc to list */
-
- if (VIR_ALLOC(newItem) != 0) {
- virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("new xml desc"));
+ if (VIR_REALLOC_N(state->list.sources, state->list.nsources+1) < 0) {
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, NULL);
return -1;
}
+ memset(state->list.sources + state->list.nsources, 0, sizeof(*state->list.sources));
- if (asprintf(&newItem->val,
- "<source><host name='%s'/><dir path='%s'/></source>",
- state->host, path) <= 0) {
- virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("asprintf failed"));
- VIR_FREE(newItem);
+ src = state->list.sources + state->list.nsources++;
+ if (!(src->host.name = strdup(state->host)) ||
+ !(src->dir = strdup(path)))
return -1;
- }
-
- newItem->len = strlen(newItem->val);
- newItem->next = state->list;
- state->list = newItem;
+ src->format = VIR_STORAGE_POOL_NETFS_NFS;
return 0;
}
@@ -368,10 +361,18 @@
};
xmlDocPtr doc = NULL;
xmlXPathContextPtr xpath_ctxt = NULL;
- virNetfsDiscoverState state = { .host = NULL, .list = NULL };
+ virNetfsDiscoverState state = {
+ .host = NULL,
+ .list = {
+ .type = VIR_STORAGE_POOL_NETFS,
+ .nsources = 0,
+ .sources = NULL
+ }
+ };
const char *prog[] = { SHOWMOUNT, "--no-headers", "--exports", NULL, NULL };
int exitstatus;
char *retval = NULL;
+ unsigned int i;
doc = xmlReadDoc((const xmlChar *)srcSpec, "srcSpec.xml", NULL,
XML_PARSE_NOENT | XML_PARSE_NONET |
@@ -400,18 +401,21 @@
&state, &exitstatus) < 0)
goto cleanup;
- retval = __virStringListJoin(state.list, SOURCES_START_TAG,
- SOURCES_END_TAG, "\n");
+ retval = virStoragePoolSourceListFormat(conn, &state.list);
if (retval == NULL) {
virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("retval"));
goto cleanup;
}
cleanup:
+ for (i = 0; i < state.list.nsources; i++)
+ virStoragePoolSourceFree(&state.list.sources[i]);
+
+ VIR_FREE(state.list.sources);
+ VIR_FREE(state.host);
+
xmlFreeDoc(doc);
xmlXPathFreeContext(xpath_ctxt);
- VIR_FREE(state.host);
- __virStringListFree(state.list);
return retval;
}
diff -r 32908ef883dc src/storage_backend_logical.c
--- a/src/storage_backend_logical.c Wed Oct 29 11:26:37 2008 +0000
+++ b/src/storage_backend_logical.c Wed Oct 29 11:29:16 2008 +0000
@@ -295,6 +295,7 @@
dev = &thisSource->devices[thisSource->ndevice];
thisSource->ndevice++;
+ thisSource->format = VIR_STORAGE_POOL_LOGICAL_LVM2;
memset(dev, 0, sizeof(*dev));
dev->path = pvname;
@@ -331,6 +332,8 @@
int i;
memset(&sourceList, 0, sizeof(sourceList));
+ sourceList.type = VIR_STORAGE_POOL_LOGICAL;
+
if (virStorageBackendRunProgRegex(conn, NULL, prog, 1, regexes, vars,
virStorageBackendLogicalFindPoolSourcesFunc,
&sourceList, &exitstatus) < 0)
diff -r 32908ef883dc src/storage_conf.c
--- a/src/storage_conf.c Wed Oct 29 11:26:37 2008 +0000
+++ b/src/storage_conf.c Wed Oct 29 11:29:16 2008 +0000
@@ -472,6 +472,68 @@
return NULL;
}
+static int
+virStoragePoolSourceFormat(virConnectPtr conn,
+ virBufferPtr buf,
+ virStorageBackendPoolOptionsPtr options,
+ virStoragePoolSourcePtr src)
+{
+ int i, j;
+
+ virBufferAddLit(buf," <source>\n");
+ if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_HOST) &&
+ src->host.name)
+ virBufferVSprintf(buf," <host name='%s'/>\n", src->host.name);
+
+ if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DEVICE) &&
+ src->ndevice) {
+ for (i = 0 ; i < src->ndevice ; i++) {
+ if (src->devices[i].nfreeExtent) {
+ virBufferVSprintf(buf," <device path='%s'>\n",
+ src->devices[i].path);
+ for (j = 0 ; j < src->devices[i].nfreeExtent ; j++) {
+ virBufferVSprintf(buf, " <freeExtent start='%llu' end='%llu'/>\n",
+ src->devices[i].freeExtents[j].start,
+ src->devices[i].freeExtents[j].end);
+ }
+ virBufferAddLit(buf," </device>\n");
+ }
+ else
+ virBufferVSprintf(buf, " <device path='%s'/>\n",
+ src->devices[i].path);
+ }
+ }
+ if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DIR) &&
+ src->dir)
+ virBufferVSprintf(buf," <dir path='%s'/>\n", src->dir);
+ if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_ADAPTER) &&
+ src->adapter)
+ virBufferVSprintf(buf," <adapter name='%s'/>\n", src->adapter);
+ if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_NAME) &&
+ src->name)
+ virBufferVSprintf(buf," <name>%s</name>\n", src->name);
+
+ if (options->formatToString) {
+ const char *format = (options->formatToString)(src->format);
+ if (!format) {
+ virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("unknown pool format number %d"),
+ src->format);
+ return -1;
+ }
+ virBufferVSprintf(buf," <format type='%s'/>\n", format);
+ }
+
+
+ if (src->authType == VIR_STORAGE_POOL_AUTH_CHAP)
+ virBufferVSprintf(buf," <auth type='chap' login='%s' passwd='%s'>\n",
+ src->auth.chap.login,
+ src->auth.chap.passwd);
+ virBufferAddLit(buf," </source>\n");
+
+ return 0;
+}
+
char *
virStoragePoolDefFormat(virConnectPtr conn,
@@ -480,7 +542,6 @@
virBuffer buf = VIR_BUFFER_INITIALIZER;
const char *type;
char uuid[VIR_UUID_STRING_BUFLEN];
- int i, j;
options = virStorageBackendPoolOptionsForType(def->type);
if (options == NULL)
@@ -505,56 +566,8 @@
virBufferVSprintf(&buf," <available>%llu</available>\n",
def->available);
- virBufferAddLit(&buf," <source>\n");
- if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_HOST) &&
- def->source.host.name)
- virBufferVSprintf(&buf," <host name='%s'/>\n", def->source.host.name);
-
- if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DEVICE) &&
- def->source.ndevice) {
- for (i = 0 ; i < def->source.ndevice ; i++) {
- if (def->source.devices[i].nfreeExtent) {
- virBufferVSprintf(&buf," <device path='%s'>\n",
- def->source.devices[i].path);
- for (j = 0 ; j < def->source.devices[i].nfreeExtent ; j++) {
- virBufferVSprintf(&buf, " <freeExtent start='%llu' end='%llu'/>\n",
- def->source.devices[i].freeExtents[j].start,
- def->source.devices[i].freeExtents[j].end);
- }
- virBufferAddLit(&buf," </device>\n");
- }
- else
- virBufferVSprintf(&buf, " <device path='%s'/>\n",
- def->source.devices[i].path);
- }
- }
- if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DIR) &&
- def->source.dir)
- virBufferVSprintf(&buf," <dir path='%s'/>\n", def->source.dir);
- if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_ADAPTER) &&
- def->source.adapter)
- virBufferVSprintf(&buf," <adapter name='%s'/>\n", def->source.adapter);
- if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_NAME) &&
- def->source.name)
- virBufferVSprintf(&buf," <name>%s</name>\n", def->source.name);
-
- if (options->formatToString) {
- const char *format = (options->formatToString)(def->source.format);
- if (!format) {
- virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("unknown pool format number %d"),
- def->source.format);
- goto cleanup;
- }
- virBufferVSprintf(&buf," <format type='%s'/>\n", format);
- }
-
-
- if (def->source.authType == VIR_STORAGE_POOL_AUTH_CHAP)
- virBufferVSprintf(&buf," <auth type='chap' login='%s' passwd='%s'>\n",
- def->source.auth.chap.login,
- def->source.auth.chap.passwd);
- virBufferAddLit(&buf," </source>\n");
+ if (virStoragePoolSourceFormat(conn, &buf, options, &def->source) < 0)
+ goto cleanup;
virBufferAddLit(&buf," <target>\n");
@@ -1271,22 +1284,41 @@
return 0;
}
-char *virStoragePoolSourceListFormat(virConnectPtr conn ATTRIBUTE_UNUSED,
+char *virStoragePoolSourceListFormat(virConnectPtr conn,
virStoragePoolSourceListPtr def)
{
- int i, j;
+ virStorageBackendPoolOptionsPtr options;
virBuffer buf = VIR_BUFFER_INITIALIZER;
+ const char *type;
+ int i;
- virBufferAddLit(&buf, "<sources>");
+ options = virStorageBackendPoolOptionsForType(def->type);
+ if (options == NULL)
+ return NULL;
+
+ type = virStorageBackendToString(def->type);
+ if (!type) {
+ virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ "%s", _("unexpected pool type"));
+ goto cleanup;
+ }
+
+ virBufferAddLit(&buf, "<sources>\n");
for (i = 0; i < def->nsources; i++) {
- virBufferVSprintf(&buf, "<source><name>%s</name>", def->sources[i].name);
- for (j = 0; j < def->sources[i].ndevice; j++)
- virBufferVSprintf(&buf, "<device path='%s'/>", def->sources[i].devices[j].path);
- virBufferAddLit(&buf, "</source>");
+ virStoragePoolSourceFormat(conn, &buf, options, &def->sources[i]);
}
- virBufferAddLit(&buf, "</sources>");
+ virBufferAddLit(&buf, "</sources>\n");
+
+ if (virBufferError(&buf))
+ goto no_memory;
return virBufferContentAndReset(&buf);
+
+ no_memory:
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, NULL);
+ cleanup:
+ free(virBufferContentAndReset(&buf));
+ return NULL;
}
diff -r 32908ef883dc src/storage_conf.h
--- a/src/storage_conf.h Wed Oct 29 11:26:37 2008 +0000
+++ b/src/storage_conf.h Wed Oct 29 11:29:16 2008 +0000
@@ -252,6 +252,7 @@
typedef struct _virStoragePoolSourceList virStoragePoolSourceList;
typedef virStoragePoolSourceList *virStoragePoolSourceListPtr;
struct _virStoragePoolSourceList {
+ int type;
unsigned int nsources;
virStoragePoolSourcePtr sources;
};
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
2
1
[libvirt] libvirt adds ", boot-on" to qemu-kvm command line - prevents guest boot!
by Bruce Rogers 28 Oct '08
by Bruce Rogers 28 Oct '08
28 Oct '08
I'm experimenting with libvirt and qemu-kvm using a raw hard disk image that has a bootable DOS partition in it. I noticed that libvirt was adding the ",boot=on" option to the disk section of the qemu-kvm command line. This prevents the guest from booting somehow. If that option is removed, then the guest can boot just fine. What is that option used for and is there any way to cause libvirt to not add it in my scenario?
- Bruce Rogers
1
0
Last week, I set out simply to adjust libvirt to accommodate a
recent gnulib API change, whereby you now include the standard
<netdb.h> rather than the gnulib-made-up "getaddrinfo.h" header file.
That meant pulling in many gnulib updates (a lot's been happening
on the mingw portability front recently), and there's been some
churn, so I'd pull in an update, find that it exposes more portability
problems, fix them, (but that may have also added a new warning, so fix
that), pull in another update, find more, etc. Most of this has been
mingw-specific, but I addressed some of the test-related warnings by
removing ifdefs so that the same code is compiled in both mingw and
non-mingw cases.
I think we've settled on a local fixed point, with the result
triggering only the two XDR warnings I already wrote about.
This patch series includes all of the above (leaving out 10K
lines of automatically-pulled-from-gnulib diffs) and cleans up
the state of .cvsignore and .gitignore files:
1 exempt gnulib from ctype-macros prohibition
2 exempt gnulib from write-avoidance syntax check
3 use ARRAY_CARDINALITY more
4 * src/network_conf.c: Include <string.h> for declaration of memcmp.
5 adapt to API change in gnulib
6 use more gnulib modules
7 updates from gnulib (this is the 10K-line diff -- mostly omitted)
8 socketcompat.h: simplify, to match latest gnulib
9 use errno, not socket_errno()
10 remove duplicate inclusion of "remote_protocol.h" (before <config.h>!)
11 * src/remote_internal.c (remoteFindDaemonPath) [!WIN32]: Don't compile.
12 include netinet etc #ifndef HAVE_WINSOCK2_H
13 * qemud/remote_protocol.x: Include "remote_protocol.h" and <rpc/xdr.h>.
14 * remote_protocol.c, remote_protocol.h: regenerate
15 cvsignore mingw build artifacts: *.exe
16 avoid many mingw-specific warnings
17 avoid compiler warning when all storage backends are disabled
2
44
I'm looking into implementing emitting events from the xen driver, and I've run into a bit of a snag that I would like to discuss
I've attached an old version of my patch for reference.
However - from past discussions, I know that there was a desire to keep the xen driver stateless. However, given the semantics of xenstore watches, and events, I'm not sure I can see a way to preserve this.
Lets take the case of creating a new domain:
XenStore gives us the functionaliity to put a watch on the special xenstore key @introduceDomain.
However, when the watch fires - I see no mechanism of determining which domain has been introduced.
The only mechanism I can find is to maintain a list of domains, and keep this up to date with events.
So I'm wondering if anyone has any ideas, or if this will introduce unwanted, but necessary state into the driver?
Ben
2
1
Hi -
I'm about to start working on host device enumeration, along the
(HAL-ish) lines of what was discussed back in April:
https://www.redhat.com/archives/libvir-list/2008-April/msg00005.html
I know the xml details haven't been fully fleshed out, but there seems
to be agreement that it will be a fairly direct mapping from (a subset
of the) HAL info to the details that we need in the xml. Doubtless it
will take a while to figure out exactly what subset suffices (and, for
that matter, if everything needed is available via HAL ...), but I think
the work is well-defined for some of the obvious details (discussed in
the above thread) on which there's broad agreement.
Is anyone working on such an implementation?
Thanks,
Dave
3
37
All,
One thing that oVirt would like to have (and that might be useful for other
users) is a call that would do some basic sanity checking for live migration.
This call would go over to the remote libvirtd, do some checks, and
return whether we think migration is likely to succeed. Note that I say
"likely to succeed", because there are certainly things that can cause migration
to fail after we've made checks, but anything is better than what we have today
("try it and pray").
Now, in order for this call to be widely useful, I think we would have to allow
the caller to specify *which* of the available checks they would like to
perform, and then have some sort of return value that indicated if there are
show-stopper problems, or just problems that may cause things to be sub-optimal
on the remote side. The caller could then decide what action it wants to take.
There is also a corollary to the "is it sane for me to migrate", which is, given
two hosts A and B, what's the lowest common denominator I need to run my guest
at so that migration will likely be successful between them. This could also be
used by management apps to make sure things are configured properly for the
guest before ever starting it.
The biggest problem with implementing these calls, however, is that there is no
comprehensive list of things we should check. This e-mail is an attempt to
write down some of the more obvious things we need to check, and to garner
discussion of things I might have missed. Once I have a proper list, I'll add
it to the TODO page on the libvirt Wiki so it's at least somewhere permanent.
Note that we don't have to implement *all* of these as a first go at this; if we
leave it open enough, we can add more checks as we go along without breaking
compatibility.
MIGRATION CRITERIA:
0) Matching hypervisors - seems obvious, but I'm not sure if we have these
checks today. Make sure we don't try to migrate Xen to KVM or vice-versa. We
also might want to think of at least warning the caller if you try to migrate
from a "newer" hypervisor (say, Xen 3.2) to an "older" hypervisor (say, Xen
3.1). That should, in theory, work, but maybe the caller would prefer not to do
that if possible. Rich has pointed out that KVM and Xen are accidentally
incompatible in libvirt, but we should make it explicit.
1) Matching CPU architectures - also obvious, but as far as I know today,
there's no checking for this (well, at least in Xen; I don't know about
libvirt). So you can happily attempt to migrate from i386 -> ia64, and watch
the fireworks. We also need to make sure you can't migrate x86_64 -> i386. I
believe i386 -> x86_64 should work, but this might be hypervisor dependent.
2) Matching CPU vendors - this one isn't a hard requirement; given the things
below, we may still be likely to succeed even if we go from AMD to Intel or
vice-versa. It still might be useful information for the caller to know.
3) CPU flags - the CPU flags of the destination *must* be a superset of the CPU
flags that were presented to the guest at startup. Many OS's and application
check for CPU flags once at startup to choose optimized routines, and then never
check again; if they happened to select sse3, and sse3 is not there on the
destination, then they will (eventually) crash.
This is where the CPU masking technology and the lowest common denominator
libvirt call can make a big difference. If you make sure to mask some of the
CPU flags off of the guest when you are first creating it, then the destination
host just needs a superset of the flags that were presented to the guest at
bootup, which makes the problem easier.
4) Number of CPUs - generally, you want the destination to have at least one
physical CPU for each virtual CPU assigned to the guest. However, I can see use
cases where this might not be the case (temporary or emergency migrations). So
this would probably be a warning, and the caller can make the choice of whether
to proceed.
5a) Memory - non-NUMA -> non-NUMA - fairly straightforward. The destination
must have enough memory to fit the guest memory. We might want to do some
"extra" checking on the destination to make sure we aren't going to OOM the
destination as soon as we arrive.
5b) Memory - non-NUMA -> NUMA - A little trickier. There are no cpusets we
have to worry about, since we are coming from non-NUMA, but for absolute best
performance, we should try to fit the whole guest into a single NUMA node. Of
course, if that node is overloaded, that may be a bad idea. NUMA placement
problem, basically.
5c) Memory - NUMA -> non-NUMA - Less tricky. On the destination, all memory is
"equally" far away, so no need to worry about cpusets. Just have to make sure
that there is enough memory on the destination for the guest.
5d) Memory - NUMA -> NUMA - Tricky, just like case 5b). Need to determine if
there is enough memory in the machine first, then check if we can fit the guest
in a single node, and also check if we can match the cpuset from the source on
the destination.
6a) Networks - at the very least, the destination must have the same bridges
configured as the source side. Whether those bridges are hooked to the same
physical networks as the source or not is another question, and may be outside
the bounds of what we can/should check.
6b) Networks - we need to make sure that the device model on the remote side
supports the same devices as the source side. That is, if you have a e1000 nic
on the source side, but your destination doesn't support it, you are going to
fail the migration.
7a) Disks - we have to make sure that all of the disks on the source side are
available on the destination side, at the same paths. To be entirely clear, we
have to make sure that the file on the destination side is the *same* file as on
the source side, not just a file with the same name. For traditional
file-based, the best we can do may be path names. For device names (like LVM,
actual disk partitions, etc.), we might be able to take advantage of device
enumaration API's and validate that the device info is the same (UUID matching,
etc.).
7b) Disks - Additionally, we need to make sure that the device model on the
remote side supports the same devices as the source side. That is, if you have
a virtio drive on the source side, but your destination host doesn't support
virtio on the backend, you are going to fail. (virtio might be a bad example,
but there might be further things in the device model in the future that we
might not necessarily have on both ends).
------ That's the absolute basic criteria. More esoteric/less thought-out
criteria follow:
8) Time skew - this is less thought out at the moment, but if you calibrated
your lpj at boot time, and now you migrate to a host with a different clock
frequency, your time will run either fast or slow compared to what you expect.
Also synchronized vs. unsynchronized TSC could cause issues, etc.
9) PCI-passthrough - this is actually a check on the *source* side. If the
guest is using a PCI passthrough device, it *usually* doesn't make sense to
live migrate it. On the other hand, it looks like various groups are trying to
make this work (with the bonding of a PV NIC to a PCI-passthrough NIC), so we
need to keep that in mind, and not necessarily make this a hard failure.
10) MSR's?? - I've thought about this one before, but I'm not sure what the
answer is. Unfortunately, MSR's in virtualization are sort of done hodge-podge.
That is, some MSR's are emulated for the guests, some MSR's guests have direct
control over, and some aren't emulated at all. This one can get ugly fast; it's
probably something we want to leave until later.
11) CPUID?? - Not entirely sure about this one; there is a lot of
model-specific information encoded in the various CPUID calls (things like cache
size, cache line size, etc. etc). However, I don't know if CPUID instructions
are trapped-n-emulated under the different hypervisors, or if they are done
right on the processor itself. I guess if an OS or application called this at
startup, cached the information, and then checked again later it might get
upset, but it seems somewhat unlikely.
Things that I've missed?
Thanks,
Chris Lalancette
6
9
I've been building with mingw to make sure that my gnulib-upgrade-and-extend
patch doesn't break anything and found some compiler warnings.
I fixed most of them, but this one is ugly:
../qemud/remote_protocol.c:317: warning: assignment from incompatible pointer type
../qemud/remote_protocol.c:346: warning: assignment from incompatible pointer type
That's due to the fact that the mingw xdr.h header,
/usr/i686-pc-mingw32/sys-root/mingw/include/rpc/xdr.h, defines this
#define XDR_INLINE(xdrs, len) \
(*(xdrs)->x_ops->x_inline)(xdrs, len)
and has an x_inline member of type long*,
typedef struct {
enum xdr_op x_op; /* operation; fast additional param */
struct xdr_ops {
bool_t (*x_getlong)(); /* get a long from underlying stream */
bool_t (*x_putlong)(); /* put a long to " */
bool_t (*x_getbytes)();/* get some bytes from " */
bool_t (*x_putbytes)();/* put some bytes to " */
u_int (*x_getpostn)();/* returns bytes off from beginning */
bool_t (*x_setpostn)();/* lets you reposition the stream */
long * (*x_inline)(); /* buf quick ptr to buffered data */
while we're used to one with type matching buf: int32_t*:
If you're serious about getting rid of warnings even on mingw,
here's one approach:
diff --git a/qemud/remote_protocol.c b/qemud/remote_protocol.c
index 68e9696..c8cf504 100644
--- a/qemud/remote_protocol.c
+++ b/qemud/remote_protocol.c
@@ -314,7 +314,7 @@ xdr_remote_node_get_info_ret (XDR *xdrs, remote_node_get_info_ret *objp)
return FALSE;
if (!xdr_quad_t (xdrs, &objp->memory))
return FALSE;
- buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
+ buf = (void*)XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_int (xdrs, &objp->cpus))
return FALSE;
@@ -343,7 +343,7 @@ xdr_remote_node_get_info_ret (XDR *xdrs, remote_node_get_info_ret *objp)
return FALSE;
if (!xdr_quad_t (xdrs, &objp->memory))
return FALSE;
- buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
+ buf = (void*)XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
if (buf == NULL) {
if (!xdr_int (xdrs, &objp->cpus))
return FALSE;
Better would be to fix the decl in xdr.h, but probably not feasible.
Alternatively, redefine XDR_INLINE for mingw, adding the void* cast in that.
But that means peeking inside (and copying) the current definition,
so I prefer the above.
So I'm leaning towards using the patch above.
3
3
FYI, I just committed the following patch to remove a couple of unneccessary
includes of sys/poll.h, and disable the event-test demo on platforms which
lack sys/poll.h This makes the mingw builds work again
Regards,
Daniel
Index: configure.in
===================================================================
RCS file: /data/cvs/libvirt/configure.in,v
retrieving revision 1.176
diff -u -p -r1.176 configure.in
--- configure.in 23 Oct 2008 13:18:18 -0000 1.176
+++ configure.in 24 Oct 2008 13:08:15 -0000
@@ -70,7 +70,7 @@ dnl Availability of various common funct
AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity getuid getgid])
dnl Availability of various common headers (non-fatal if missing).
-AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/syslimits.h sys/utsname.h sys/wait.h winsock2.h sched.h termios.h])
+AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/syslimits.h sys/utsname.h sys/wait.h winsock2.h sched.h termios.h sys/poll.h])
dnl Where are the XDR functions?
dnl If portablexdr is installed, prefer that.
Index: examples/domain-events/events-c/event-test.c
===================================================================
RCS file: /data/cvs/libvirt/examples/domain-events/events-c/event-test.c,v
retrieving revision 1.1
diff -u -p -r1.1 event-test.c
--- examples/domain-events/events-c/event-test.c 23 Oct 2008 13:18:18 -0000 1.1
+++ examples/domain-events/events-c/event-test.c 24 Oct 2008 13:08:15 -0000
@@ -1,6 +1,9 @@
#include <config.h>
+
#include <stdio.h>
#include <string.h>
+
+#if HAVE_SYS_POLL_H
#include <sys/types.h>
#include <sys/poll.h>
#include <libvirt/libvirt.h>
@@ -259,3 +262,9 @@ int main(int argc, char **argv)
return 0;
}
+#else
+int main(void) {
+ printf("event-test program not available without sys/poll.h support\n");
+ return 1;
+}
+#endif
Index: src/libvirt.c
===================================================================
RCS file: /data/cvs/libvirt/src/libvirt.c,v
retrieving revision 1.162
diff -u -p -r1.162 libvirt.c
--- src/libvirt.c 24 Oct 2008 08:55:13 -0000 1.162
+++ src/libvirt.c 24 Oct 2008 13:08:16 -0000
@@ -16,7 +16,6 @@
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
-#include <sys/poll.h>
#include <unistd.h>
#include <assert.h>
#ifdef HAVE_SYS_WAIT_H
Index: src/remote_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/remote_internal.c,v
retrieving revision 1.89
diff -u -p -r1.89 remote_internal.c
--- src/remote_internal.c 23 Oct 2008 13:18:18 -0000 1.89
+++ src/remote_internal.c 24 Oct 2008 13:08:16 -0000
@@ -34,7 +34,6 @@
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
-#include <sys/poll.h>
#include <fcntl.h>
#ifdef HAVE_SYS_WAIT_H
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
3
2
[libvirt] PATCH: Remove util-lib file and replace with libvirt_util.la
by Daniel P. Berrange 24 Oct '08
by Daniel P. Berrange 24 Oct '08
24 Oct '08
We've currently got a slightly nasty hack where some of the stuff from
util.c is split into a util-lib.c file so it can be compiled twice,
once for libvirt.la, and second for virsh, without exporting it in our
public API. I'm trying to clean up the code / file deps and build stuff
in preparation of dlopen() support of drivers. We also have a bunch of
stuff in util.a that is exported unofficially in the ABI.
This patch demonstrates a different approach, putting the util-lib.c code
back into util.c. We then define a libtool convenience library covering
a bunch of our generic common code, that is linked to both libvirt.la
and virsh. This also lets us remove most of the secret exports from
util.c.
The main change is that a little more code is statically linked into
virsh binary itself. Personally I don't think this is a huge problem.
Another possible approach though could be to create a real libvirt-common.so
file which gets installed into /usr/lib, but is explicitly not preserving
ABI. We could enforce this by using a version script to encode a version
number against every symbol. This would mean anyone linking to the
libvirt-common.so would be forced to relink on every new update - which
would be such a PITA only in-tree programs like virsh & libvirtd would
do it.
Daniel
diff -r 5bd402f3762e configure.in
--- a/configure.in Fri Oct 24 14:13:53 2008 +0100
+++ b/configure.in Fri Oct 24 14:14:07 2008 +0100
@@ -671,6 +671,8 @@
with_storage_dir=yes
if test "$with_libvirtd" = "no"; then
+ with_qemu=no
+ with_lxc=no
with_storage_dir=no
with_storage_fs=no
with_storage_lvm=no
diff -r 5bd402f3762e qemud/Makefile.am
--- a/qemud/Makefile.am Fri Oct 24 14:13:53 2008 +0100
+++ b/qemud/Makefile.am Fri Oct 24 14:14:07 2008 +0100
@@ -9,8 +9,7 @@
remote_dispatch_prototypes.h \
remote_dispatch_localvars.h \
remote_dispatch_proc_switch.h \
- remote_protocol.h remote_protocol.c \
- $(srcdir)/../src/util-lib.c
+ remote_protocol.h remote_protocol.c
AVAHI_SOURCES = \
mdns.c mdns.h
@@ -88,7 +87,7 @@
$(POLKIT_LIBS)
libvirtd_DEPENDENCIES = ../src/libvirt.la
-libvirtd_LDADD = ../src/libvirt.la ../gnulib/lib/libgnu.la
+libvirtd_LDADD = ../src/libvirt.la ../src/libvirt_util.la ../gnulib/lib/libgnu.la
if HAVE_POLKIT
policydir = $(datadir)/PolicyKit/policy
diff -r 5bd402f3762e src/Makefile.am
--- a/src/Makefile.am Fri Oct 24 14:13:53 2008 +0100
+++ b/src/Makefile.am Fri Oct 24 14:14:07 2008 +0100
@@ -37,21 +37,30 @@
lib_LTLIBRARIES = libvirt.la
+noinst_LTLIBRARIES = libvirt_util.la
+
# These files are not related to driver APIs. Simply generic
# helper APIs for various purposes
-GENERIC_LIB_SOURCES = \
- bridge.c bridge.h \
+UTIL_SOURCES = \
buf.c buf.h \
conf.c conf.h \
event.c event.h \
- iptables.c iptables.h \
memory.c memory.h \
qparams.c qparams.h \
- stats_linux.c stats_linux.h \
uuid.c uuid.h \
util.c util.h \
virterror.c \
xml.c xml.h
+
+DRIVER_SOURCES = \
+ driver.h \
+ hash.c hash.h \
+ internal.h \
+ libvirt.c \
+ bridge.c bridge.h \
+ iptables.c iptables.h \
+ stats_linux.c stats_linux.h
+
# Domain driver generic impl APIs
DOMAIN_CONF_SOURCES = \
@@ -147,14 +156,13 @@
# First deal with sources usable in non-daemon context
libvirt_la_SOURCES = \
- driver.h \
- hash.c hash.h \
- internal.h \
- libvirt.c \
- $(GENERIC_LIB_SOURCES) \
+ $(DRIVER_SOURCES) \
$(DOMAIN_CONF_SOURCES) \
$(NETWORK_CONF_SOURCES) \
$(STORAGE_CONF_SOURCES)
+
+libvirt_util_la_SOURCES = \
+ $(UTIL_SOURCES)
# Drivers usable outside daemon context
if WITH_TEST
@@ -180,6 +188,7 @@
endif
libvirt_la_SOURCES += $(STORAGE_DRIVER_SOURCES)
libvirt_la_SOURCES += $(STORAGE_DRIVER_FS_SOURCES)
+endif
if WITH_QEMU
libvirt_la_SOURCES += $(QEMU_DRIVER_SOURCES)
@@ -200,7 +209,6 @@
if WITH_STORAGE_DISK
libvirt_la_SOURCES += $(STORAGE_DRIVER_DISK_SOURCES)
endif
-endif
# Add all conditional sources just in case...
EXTRA_DIST += \
@@ -220,17 +228,18 @@
libvirt_la_LIBADD = $(LIBXML_LIBS) $(GNUTLS_LIBS) $(SASL_LIBS) $(SELINUX_LIBS) \
$(NUMACTL_LIBS) \
+ libvirt_util.la \
@CYGWIN_EXTRA_LIBADD@ ../gnulib/lib/libgnu.la
libvirt_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libvirt_sym.version \
-version-info @LIBVIRT_VERSION_INFO@ \
$(COVERAGE_CFLAGS:-f%=-Wc,-f%) \
@CYGWIN_EXTRA_LDFLAGS@ @MINGW_EXTRA_LDFLAGS@
-libvirt_la_CFLAGS = $(COVERAGE_CFLAGS) -DIN_LIBVIRT
+libvirt_la_CFLAGS = $(COVERAGE_CFLAGS)
# Create an automake "convenience library" version of libvirt_la,
# just for testing, since the test harness requires access to internal
# bits and pieces that we don't want to make publicly accessible.
-noinst_LTLIBRARIES = libvirt_test.la
+noinst_LTLIBRARIES += libvirt_test.la
# Convert libvirt_sym.version
# to libvirt_test_sym.version, and
@@ -250,12 +259,11 @@
virsh_SOURCES = \
console.c console.h \
- util-lib.c util-lib.h \
virsh.c
virsh_LDFLAGS = $(WARN_CFLAGS) $(COVERAGE_LDFLAGS)
virsh_DEPENDENCIES = $(DEPS)
-virsh_LDADD = $(LDADDS) $(VIRSH_LIBS)
+virsh_LDADD = $(LDADDS) $(VIRSH_LIBS) libvirt_util.la
virsh_CFLAGS = $(COVERAGE_CFLAGS) $(READLINE_CFLAGS)
BUILT_SOURCES = virsh-net-edit.c virsh-pool-edit.c
@@ -320,7 +328,6 @@
libexec_PROGRAMS =
if WITH_STORAGE_DISK
-if WITH_LIBVIRTD
libexec_PROGRAMS += libvirt_parthelper
libvirt_parthelper_SOURCES = $(STORAGE_HELPER_DISK_SOURCES)
@@ -328,22 +335,19 @@
libvirt_parthelper_LDADD = $(LIBPARTED_LIBS)
libvirt_parthelper_CFLAGS = $(LIBPARTED_CFLAGS)
endif
-endif
EXTRA_DIST += $(STORAGE_HELPER_DISK_SOURCES)
if WITH_LXC
-if WITH_LIBVIRTD
libexec_PROGRAMS += libvirt_lxc
libvirt_lxc_SOURCES = \
$(LXC_CONTROLLER_SOURCES) \
- $(GENERIC_LIB_SOURCES) \
$(DOMAIN_CONF_SOURCES)
libvirt_lxc_LDFLAGS = $(WARN_CFLAGS) $(COVERAGE_LDCFLAGS)
-libvirt_lxc_LDADD = $(LIBXML_LIBS) ../gnulib/lib/libgnu.la
+libvirt_lxc_LDADD = $(LIBXML_LIBS) ../gnulib/lib/libgnu.la \
+ libvirt_util.la
libvirt_lxc_CFLAGS = $(LIBPARTED_CFLAGS)
-endif
endif
EXTRA_DIST += $(LXC_CONTROLLER_SOURCES)
diff -r 5bd402f3762e src/buf.c
--- a/src/buf.c Fri Oct 24 14:13:53 2008 +0100
+++ b/src/buf.c Fri Oct 24 14:14:07 2008 +0100
@@ -88,7 +88,7 @@
*
*/
void
-__virBufferAdd(const virBufferPtr buf, const char *str, int len)
+virBufferAdd(const virBufferPtr buf, const char *str, int len)
{
unsigned int needSize;
@@ -120,7 +120,7 @@
*
*/
void
-__virBufferAddChar (virBufferPtr buf, char c)
+virBufferAddChar (virBufferPtr buf, char c)
{
unsigned int needSize;
@@ -150,7 +150,7 @@
* Returns the buffer content or NULL in case of error.
*/
char *
-__virBufferContentAndReset(const virBufferPtr buf)
+virBufferContentAndReset(const virBufferPtr buf)
{
char *str;
if (buf == NULL)
@@ -176,7 +176,7 @@
* Return true if in error, 0 if normal
*/
int
-__virBufferError(const virBufferPtr buf)
+virBufferError(const virBufferPtr buf)
{
if (buf == NULL)
return 1;
@@ -208,7 +208,7 @@
* Do a formatted print to an XML buffer.
*/
void
-__virBufferVSprintf(const virBufferPtr buf, const char *format, ...)
+virBufferVSprintf(const virBufferPtr buf, const char *format, ...)
{
int size, count, grow_size;
va_list locarg, argptr;
diff -r 5bd402f3762e src/buf.h
--- a/src/buf.h Fri Oct 24 14:13:53 2008 +0100
+++ b/src/buf.h Fri Oct 24 14:14:07 2008 +0100
@@ -34,25 +34,18 @@
};
#endif
-char *__virBufferContentAndReset(const virBufferPtr buf);
-int __virBufferError(const virBufferPtr buf);
+char *virBufferContentAndReset(const virBufferPtr buf);
+int virBufferError(const virBufferPtr buf);
unsigned int virBufferUse(const virBufferPtr buf);
-void __virBufferAdd(const virBufferPtr buf, const char *str, int len);
-void __virBufferAddChar(const virBufferPtr buf, char c);
-void __virBufferVSprintf(const virBufferPtr buf, const char *format, ...)
+void virBufferAdd(const virBufferPtr buf, const char *str, int len);
+void virBufferAddChar(const virBufferPtr buf, char c);
+void virBufferVSprintf(const virBufferPtr buf, const char *format, ...)
ATTRIBUTE_FORMAT(printf, 2, 3);
void virBufferStrcat(const virBufferPtr buf, ...);
void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str);
void virBufferURIEncodeString (const virBufferPtr buf, const char *str);
#define virBufferAddLit(buf_, literal_string_) \
- __virBufferAdd (buf_, "" literal_string_ "", sizeof literal_string_ - 1)
-
-#define virBufferAdd(b,s,l) __virBufferAdd((b),(s),(l))
-#define virBufferAddChar(b,c) __virBufferAddChar((b),(c))
-#define virBufferVSprintf(b,f,...) __virBufferVSprintf((b),(f), __VA_ARGS__)
-
-#define virBufferContentAndReset(b) __virBufferContentAndReset((b))
-#define virBufferError(b) __virBufferError((b))
+ virBufferAdd (buf_, "" literal_string_ "", sizeof literal_string_ - 1)
#endif /* __VIR_BUFFER_H__ */
diff -r 5bd402f3762e src/conf.c
--- a/src/conf.c Fri Oct 24 14:13:53 2008 +0100
+++ b/src/conf.c Fri Oct 24 14:14:07 2008 +0100
@@ -142,7 +142,7 @@
* Free a value
*/
void
-__virConfFreeValue(virConfValuePtr val)
+virConfFreeValue(virConfValuePtr val)
{
if (val == NULL)
return;
@@ -156,7 +156,7 @@
}
virConfPtr
-__virConfNew(void)
+virConfNew(void)
{
virConfPtr ret;
@@ -691,7 +691,7 @@
#define MAX_CONFIG_FILE_SIZE (1024*1024*10)
/**
- * __virConfReadFile:
+ * virConfReadFile:
* @filename: the path to the configuration file.
*
* Reads a configuration file.
@@ -700,7 +700,7 @@
* read or parse the file, use virConfFree() to free the data.
*/
virConfPtr
-__virConfReadFile(const char *filename)
+virConfReadFile(const char *filename)
{
char *content;
int len;
@@ -724,7 +724,7 @@
}
/**
- * __virConfReadMem:
+ * virConfReadMem:
* @memory: pointer to the content of the configuration file
* @len: length in byte
*
@@ -735,7 +735,7 @@
* parse the content, use virConfFree() to free the data.
*/
virConfPtr
-__virConfReadMem(const char *memory, int len)
+virConfReadMem(const char *memory, int len)
{
if ((memory == NULL) || (len < 0)) {
virConfError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
@@ -748,7 +748,7 @@
}
/**
- * __virConfFree:
+ * virConfFree:
* @conf: a configuration file handle
*
* Frees all data associated to the handle
@@ -756,7 +756,7 @@
* Returns 0 in case of success, -1 in case of error.
*/
int
-__virConfFree(virConfPtr conf)
+virConfFree(virConfPtr conf)
{
virConfEntryPtr tmp;
if (conf == NULL) {
@@ -779,7 +779,7 @@
}
/**
- * __virConfGetValue:
+ * virConfGetValue:
* @conf: a configuration file handle
* @entry: the name of the entry
*
@@ -789,7 +789,7 @@
* associated will be freed when virConfFree() is called
*/
virConfValuePtr
-__virConfGetValue(virConfPtr conf, const char *setting)
+virConfGetValue(virConfPtr conf, const char *setting)
{
virConfEntryPtr cur;
@@ -803,7 +803,7 @@
}
/**
- * __virConfSetValue:
+ * virConfSetValue:
* @conf: a configuration file handle
* @entry: the name of the entry
* @value: the new configuration value
@@ -816,7 +816,7 @@
* Returns 0 on success, or -1 on failure.
*/
int
-__virConfSetValue (virConfPtr conf,
+virConfSetValue (virConfPtr conf,
const char *setting,
virConfValuePtr value)
{
@@ -861,7 +861,7 @@
/**
- * __virConfWriteFile:
+ * virConfWriteFile:
* @filename: the path to the configuration file.
* @conf: the conf
*
@@ -870,7 +870,7 @@
* Returns the number of bytes written or -1 in case of error.
*/
int
-__virConfWriteFile(const char *filename, virConfPtr conf)
+virConfWriteFile(const char *filename, virConfPtr conf)
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
virConfEntryPtr cur;
@@ -915,7 +915,7 @@
}
/**
- * __virConfWriteMem:
+ * virConfWriteMem:
* @memory: pointer to the memory to store the config file
* @len: pointer to the length in bytes of the store, on output the size
* @conf: the conf
@@ -928,7 +928,7 @@
* Returns the number of bytes written or -1 in case of error.
*/
int
-__virConfWriteMem(char *memory, int *len, virConfPtr conf)
+virConfWriteMem(char *memory, int *len, virConfPtr conf)
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
virConfEntryPtr cur;
diff -r 5bd402f3762e src/conf.h
--- a/src/conf.h Fri Oct 24 14:13:53 2008 +0100
+++ b/src/conf.h Fri Oct 24 14:14:07 2008 +0100
@@ -61,32 +61,22 @@
typedef struct _virConf virConf;
typedef virConf *virConfPtr;
-virConfPtr __virConfNew (void);
-virConfPtr __virConfReadFile (const char *filename);
-virConfPtr __virConfReadMem (const char *memory,
+virConfPtr virConfNew (void);
+virConfPtr virConfReadFile (const char *filename);
+virConfPtr virConfReadMem (const char *memory,
int len);
-int __virConfFree (virConfPtr conf);
-void __virConfFreeValue (virConfValuePtr val);
+int virConfFree (virConfPtr conf);
+void virConfFreeValue (virConfValuePtr val);
-virConfValuePtr __virConfGetValue (virConfPtr conf,
+virConfValuePtr virConfGetValue (virConfPtr conf,
const char *setting);
-int __virConfSetValue (virConfPtr conf,
+int virConfSetValue (virConfPtr conf,
const char *setting,
virConfValuePtr value);
-int __virConfWriteFile (const char *filename,
+int virConfWriteFile (const char *filename,
virConfPtr conf);
-int __virConfWriteMem (char *memory,
+int virConfWriteMem (char *memory,
int *len,
virConfPtr conf);
-#define virConfNew() __virConfNew()
-#define virConfReadFile(f) __virConfReadFile((f))
-#define virConfReadMem(m,l) __virConfReadMem((m),(l))
-#define virConfFree(c) __virConfFree((c))
-#define virConfFreeValue(v) __virConfFreeValue((v))
-#define virConfGetValue(c,s) __virConfGetValue((c),(s))
-#define virConfSetValue(c,s,v) __virConfSetValue((c),(s),(v))
-#define virConfWriteFile(f,c) __virConfWriteFile((f),(c))
-#define virConfWriteMem(m,l,c) __virConfWriteMem((m),(l),(c))
-
#endif /* __VIR_CONF_H__ */
diff -r 5bd402f3762e src/console.c
--- a/src/console.c Fri Oct 24 14:13:53 2008 +0100
+++ b/src/console.c Fri Oct 24 14:14:07 2008 +0100
@@ -37,7 +37,7 @@
#include "console.h"
#include "internal.h"
-#include "util-lib.h"
+#include "util.h"
/* ie Ctrl-] as per telnet */
#define CTRL_CLOSE_BRACKET '\35'
diff -r 5bd402f3762e src/libvirt_sym.version
--- a/src/libvirt_sym.version Fri Oct 24 14:13:53 2008 +0100
+++ b/src/libvirt_sym.version Fri Oct 24 14:14:07 2008 +0100
@@ -157,15 +157,6 @@
guarentee provided for the public
symbols above */
- __virConfNew;
- __virConfReadFile;
- __virConfReadMem;
- __virConfFree;
- __virConfGetValue;
- __virConfSetValue;
- __virConfWriteFile;
- __virConfWriteMem;
-
__virGetDomain;
__virGetNetwork;
__virGetStoragePool;
@@ -183,21 +174,5 @@
__virDomainMigratePerform;
__virDomainMigrateFinish;
- __virFileReadAll;
- __virStrToLong_i;
- __virStrToLong_ull;
-
- __virBufferVSprintf;
- __virBufferAdd;
- __virBufferAddChar;
- __virBufferContentAndReset;
- __virBufferError;
-
- __virMacAddrCompare;
-
- __virAlloc;
- __virAllocN;
- __virReallocN;
- __virFree;
local: *;
};
diff -r 5bd402f3762e src/util-lib.c
--- a/src/util-lib.c Fri Oct 24 14:13:53 2008 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/*
- * common, generic utility functions
- *
- * Copyright (C) 2006, 2007, 2008 Red Hat, Inc.
- * See COPYING.LIB for the License of this software
- */
-
-#include <config.h>
-
-#include <unistd.h>
-#include <errno.h>
-
-#include "util-lib.h"
-
-/* Like read(), but restarts after EINTR */
-int saferead(int fd, void *buf, size_t count)
-{
- size_t nread = 0;
- while (count > 0) {
- ssize_t r = read(fd, buf, count);
- if (r < 0 && errno == EINTR)
- continue;
- if (r < 0)
- return r;
- if (r == 0)
- return nread;
- buf = (char *)buf + r;
- count -= r;
- nread += r;
- }
- return nread;
-}
-
-/* Like write(), but restarts after EINTR */
-ssize_t safewrite(int fd, const void *buf, size_t count)
-{
- size_t nwritten = 0;
- while (count > 0) {
- ssize_t r = write(fd, buf, count);
-
- if (r < 0 && errno == EINTR)
- continue;
- if (r < 0)
- return r;
- if (r == 0)
- return nwritten;
- buf = (const char *)buf + r;
- count -= r;
- nwritten += r;
- }
- return nwritten;
-}
diff -r 5bd402f3762e src/util-lib.h
--- a/src/util-lib.h Fri Oct 24 14:13:53 2008 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * private utility functions
- *
- * Copyright (C) 2008 Red Hat, Inc.
- * See COPYING.LIB for the License of this software
- */
-
-#ifndef __UTIL_LIB_H__
-#define __UTIL_LIB_H__
-
-#include <sys/types.h>
-
-/*
- * To avoid a double definition of the function when compiling
- * programs using both util-lib and libvirt, like virsh
- */
-#ifdef IN_LIBVIRT
-#define saferead libvirt_saferead
-#define safewrite libvirt_safewrite
-#endif
-
-int saferead(int fd, void *buf, size_t count);
-ssize_t safewrite(int fd, const void *buf, size_t count);
-
-#endif
diff -r 5bd402f3762e src/util.c
--- a/src/util.c Fri Oct 24 14:13:53 2008 +0100
+++ b/src/util.c Fri Oct 24 14:14:07 2008 +0100
@@ -52,7 +52,6 @@
#include "buf.h"
#include "util.h"
#include "memory.h"
-#include "util-lib.c"
#ifndef NSIG
# define NSIG 32
@@ -502,7 +501,7 @@
}
/* Like virFileReadLimFP, but use a file descriptor rather than a FILE*. */
-int __virFileReadLimFD(int fd_arg, int maxlen, char **buf)
+int virFileReadLimFD(int fd_arg, int maxlen, char **buf)
{
int fd = dup (fd_arg);
if (fd >= 0) {
@@ -522,7 +521,7 @@
return -1;
}
-int __virFileReadAll(const char *path, int maxlen, char **buf)
+int virFileReadAll(const char *path, int maxlen, char **buf)
{
FILE *fh = fopen(path, "r");
if (fh == NULL) {
@@ -812,7 +811,7 @@
validity. This function is careful to return -1 when the string S
represents a number that is not representable as an "int". */
int
-__virStrToLong_i(char const *s, char **end_ptr, int base, int *result)
+virStrToLong_i(char const *s, char **end_ptr, int base, int *result)
{
long int val;
char *p;
@@ -869,7 +868,7 @@
/* Just like virStrToLong_i, above, but produce an "unsigned long long" value. */
int
-__virStrToLong_ull(char const *s, char **end_ptr, int base, unsigned long long *result)
+virStrToLong_ull(char const *s, char **end_ptr, int base, unsigned long long *result)
{
unsigned long long val;
char *p;
@@ -941,7 +940,7 @@
* as well as leading zeros.
*/
int
-__virMacAddrCompare (const char *p, const char *q)
+virMacAddrCompare (const char *p, const char *q)
{
unsigned char c, d;
do {
@@ -1090,3 +1089,44 @@
return idx;
}
+
+
+/* Like read(), but restarts after EINTR */
+int saferead(int fd, void *buf, size_t count)
+{
+ size_t nread = 0;
+ while (count > 0) {
+ ssize_t r = read(fd, buf, count);
+ if (r < 0 && errno == EINTR)
+ continue;
+ if (r < 0)
+ return r;
+ if (r == 0)
+ return nread;
+ buf = (char *)buf + r;
+ count -= r;
+ nread += r;
+ }
+ return nread;
+}
+
+/* Like write(), but restarts after EINTR */
+ssize_t safewrite(int fd, const void *buf, size_t count)
+{
+ size_t nwritten = 0;
+ while (count > 0) {
+ ssize_t r = write(fd, buf, count);
+
+ if (r < 0 && errno == EINTR)
+ continue;
+ if (r < 0)
+ return r;
+ if (r == 0)
+ return nwritten;
+ buf = (const char *)buf + r;
+ count -= r;
+ nwritten += r;
+ }
+ return nwritten;
+}
+
diff -r 5bd402f3762e src/util.h
--- a/src/util.h Fri Oct 24 14:13:53 2008 +0100
+++ b/src/util.h Fri Oct 24 14:14:07 2008 +0100
@@ -25,7 +25,6 @@
#ifndef __VIR_UTIL_H__
#define __VIR_UTIL_H__
-#include "util-lib.h"
#include "verify.h"
#include <sys/select.h>
@@ -46,11 +45,12 @@
int flags);
int virRun(virConnectPtr conn, const char *const*argv, int *status);
-int __virFileReadLimFD(int fd, int maxlen, char **buf);
-#define virFileReadLimFD(fd,m,b) __virFileReadLimFD((fd),(m),(b))
+int saferead(int fd, void *buf, size_t count);
+ssize_t safewrite(int fd, const void *buf, size_t count);
-int __virFileReadAll(const char *path, int maxlen, char **buf);
-#define virFileReadAll(p,m,b) __virFileReadAll((p),(m),(b))
+int virFileReadLimFD(int fd, int maxlen, char **buf);
+
+int virFileReadAll(const char *path, int maxlen, char **buf);
int virFileMatchesNameSuffix(const char *file,
const char *name,
@@ -88,11 +88,10 @@
int virFileDeletePid(const char *dir,
const char *name);
-int __virStrToLong_i(char const *s,
- char **end_ptr,
- int base,
- int *result);
-#define virStrToLong_i(s,e,b,r) __virStrToLong_i((s),(e),(b),(r))
+int virStrToLong_i(char const *s,
+ char **end_ptr,
+ int base,
+ int *result);
int virStrToLong_ui(char const *s,
char **end_ptr,
@@ -102,14 +101,12 @@
char **end_ptr,
int base,
long long *result);
-int __virStrToLong_ull(char const *s,
- char **end_ptr,
- int base,
- unsigned long long *result);
-#define virStrToLong_ull(s,e,b,r) __virStrToLong_ull((s),(e),(b),(r))
+int virStrToLong_ull(char const *s,
+ char **end_ptr,
+ int base,
+ unsigned long long *result);
-int __virMacAddrCompare (const char *mac1, const char *mac2);
-#define virMacAddrCompare(mac1,mac2) __virMacAddrCompare((mac1),(mac2))
+int virMacAddrCompare (const char *mac1, const char *mac2);
void virSkipSpaces(const char **str);
int virParseNumber(const char **str);
diff -r 5bd402f3762e src/virsh.c
--- a/src/virsh.c Fri Oct 24 14:13:53 2008 +0100
+++ b/src/virsh.c Fri Oct 24 14:14:07 2008 +0100
@@ -47,7 +47,6 @@
#include "buf.h"
#include "console.h"
#include "util.h"
-#include "util-lib.h"
static char *progname;
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
1
0
Building for mingw, I got this warning:
libvirt.c:242: warning: control reaches end of non-void function
Here's the fix:
fix mingw compilation warning
* src/libvirt.c (winsock_init) [HAVE_WINSOCK2_H]: Always return a value.
diff --git a/src/libvirt.c b/src/libvirt.c
index ca2675a..05a92d3 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -237,8 +237,7 @@ winsock_init (void)
/* http://msdn2.microsoft.com/en-us/library/ms742213.aspx */
winsock_version = MAKEWORD (2, 2);
err = WSAStartup (winsock_version, &winsock_data);
- if (err != 0)
- return -1;
+ return err == 0 ? 0 : -1;
}
#endif
--
1.6.0.2.588.g3102
3
3
[libvirt] [PATCH] Allow changing ejectable device in domains using default qemu emulator
by Stuart Jansen 23 Oct '08
by Stuart Jansen 23 Oct '08
23 Oct '08
When a qemu domain is launched but an emulator is not explicitly
defined, the default emulator is used. Attempts to attach ejectable
devices to a domains using the default emulator fail with the error:
"Error Connecting CDROM: internal error\nCannot determine QEMU argv
syntax (null)".
The following patch is based on similar code in qemudStartVMDaemon() and
qemudBuildCommandLine(). I've tested it and it works.
Honestly, though, I think this patch is just a band-aid. I'd like to
supply a better patch, but I don't have enough experience to judge
certain side effects.
Instead of requiring functions to determine the emulator that will be
used to launch the next qemu domain, qemudStartVMDaemon() should record
the emulator that was used to start the current domain. It should also
record the emulator's capabilities.
This would make it unnecessary to call virDomainDefDefaultEmulator() in
qemudDomainChangeEjectableMedia(). It would also make it possible to
remove the virDomainDefDefaultEmulator() call from
qemudBuildCommandLine().
However, testCompareXMLToArgvFiles() will fail because
qemudBuildCommandLine() needs to know vm->def->emulator and
virDomainDefParseFile() doesn't set vm->def->emulator to a default
value. I don't know if this is a real problem, or if it just means the
test needs to be updated.
In addition, if we simply set vm->dev->emulator =
strdup(virDomainDefDefaultEmulator()) in qemudStartVMDaemon() then
virDomainDefFormat() will dump <emulator>...</emulator> for domains that
did't actually have it explicitly defined. I don't know if this is a bug
or improvement, but it is a change in behavior.
2
1
Now sure where to report this. Looks like that hourly CVS snapshot
haven't been working for more than a month.
If hourly snapshots are no longer being created, the Web site should
probably be update.
http://libvirt.org/downloads.html
2
1
The following patch series implements the Events API discussed here previously in this thread:
http://www.redhat.com/archives/libvir-list/2008-September/msg00321.html
http://www.redhat.com/archives/libvir-list/2008-October/msg00245.html and
https://www.redhat.com/archives/libvir-list/2008-October/msg00432.html
Once again, I have broken these into the following patches:
events-01-public-api Changes to libvirt.h, and libvirt.c
events-02-internal-api Changes to internal.h and event code
events-03-qemud Changes to the daemon
events-04-qemud-rpc-protocol Changes to the qemud rpc protocol
events-05-driver.patch Changes to the driver API
events-06-driver-qemu Changes to the qemu driver
events-07-driver-remote Changes to the remote driver
events-08-driver-lxc Minor changes to LXC driver structure to prevent compile errors
events-09-driver-openvz Minor changes to openvz driver structure to prevent compile errors
events-10-driver-test Minor changes to test driver structure to prevent compile errors
events-11-example-testapp Test app, and infrastructure changes for an example dir
events-12-python-ignore.patch Add functions to be ignored, for now
Differences from last submission -
Formatting issues brought up by Daniel V
Some protocol simplifications
General fixes suggested from last time around.
Removal of POLLxxx stuff (this caused a bit of churn)
I think I got them all, but please let me know if I missed something.
Again, domain events are only emitted from qemu/kvm guests.
Ben Guthro
3
34
23 Oct '08
Attached is an updated patch for adding <device> tags to logical
findPoolSources. Given danpb's last feedback, I completely removed the XML
parsing and did it all with structures. The result should (hopefully) be a lot
easier on the eyes, and is a little more generic.
Signed-off-by: Chris Lalancette <clalance(a)redhat.com>
2
2
As suggested by danpb, to fix up the regression caused by last week's VIR_ENUM
cleanup patch, add a ".defaultFormat" member to .poolOptions. In
storage_conf.c, if virXPathString(/pool/source/format/@type) returns NULL, then
set the pool type to .defaultFormat; otherwise, lookup the type via
formatFromString.
Signed-off-by: Chris Lalancette <clalance(a)redhat.com>
3
3
This is actually two changes sets.
The first part is an update from gnulib (including the fix for API change),
the second adjusts .cvsignore files (sorting at same time)
so that "git status" is clean after you run "make sync-vcs-ignore-files"
to generate all .gitignore files.
For reference, the complete (5000+-line) patch is here:
http://meyering.net/code/tmp/libvirt-gnulib.patch
If no one comments, I'll commit this in a couple hours.
Jim
>From 89a1178cd0beaadbda730aacc67fe8f27e919914 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Wed, 22 Oct 2008 16:56:58 +0200
Subject: [PATCH 1/2] adapt to API change in gnulib
* qemud/qemud.c: Include <netdb.h>, not "getaddrinfo.h"
* src/remote_internal.c: Likewise.
updates from gnulib
* gnulib/lib/.cvsignore:
* gnulib/lib/Makefile.am:
...
---
.gitignore | 32 ---
gnulib/lib/.cvsignore | 6 +
gnulib/lib/.gitignore | 23 --
gnulib/lib/Makefile.am | 194 +++++++++++++--
gnulib/lib/arpa_inet.in.h | 6 +
gnulib/lib/c-ctype.h | 17 ++-
gnulib/lib/float.in.h | 6 +-
gnulib/lib/gai_strerror.c | 7 +-
gnulib/lib/getaddrinfo.c | 18 ++-
gnulib/lib/getaddrinfo.h | 163 ------------
gnulib/lib/getdelim.c | 15 +-
gnulib/lib/netinet_in.in.h | 6 +-
gnulib/lib/poll.c | 439 ++++++++++++++++++++++++++++----
gnulib/lib/stdint.in.h | 5 +-
gnulib/lib/stdio.in.h | 90 +++++++
gnulib/lib/stdlib.in.h | 83 ++++++
gnulib/lib/string.in.h | 22 ++-
gnulib/lib/sys_select.in.h | 37 +++-
gnulib/lib/sys_socket.in.h | 311 ++++++++++++++++++++++-
gnulib/lib/sys_stat.in.h | 50 ++++-
gnulib/lib/sys_time.in.h | 6 +-
gnulib/lib/unistd.in.h | 167 ++++++++++++-
gnulib/lib/vasnprintf.c | 82 ++++++-
gnulib/lib/wchar.in.h | 10 +
gnulib/m4/arpa_inet_h.m4 | 9 +-
gnulib/m4/eoverflow.m4 | 70 -----
gnulib/m4/getaddrinfo.m4 | 16 +-
gnulib/m4/getdelim.m4 | 1 +
gnulib/m4/gnulib-cache.m4 | 2 +-
gnulib/m4/gnulib-common.m4 | 12 +-
gnulib/m4/gnulib-comp.m4 | 99 +++++++-
gnulib/m4/include_next.m4 | 32 ++-
gnulib/m4/inet_ntop.m4 | 5 +-
gnulib/m4/inet_pton.m4 | 5 +-
gnulib/m4/lib-link.m4 | 27 ++-
gnulib/m4/lib-prefix.m4 | 88 +++++--
gnulib/m4/lock.m4 | 330 ++-----------------------
gnulib/m4/posix-shell.m4 | 6 +-
gnulib/m4/stdio_h.m4 | 132 ++++++----
gnulib/m4/stdlib_h.m4 | 11 +-
gnulib/m4/strdup.m4 | 22 ++-
gnulib/m4/string_h.m4 | 11 +-
gnulib/m4/sys_select_h.m4 | 20 ++-
gnulib/m4/sys_socket_h.m4 | 64 ++++-
gnulib/m4/sys_stat_h.m4 | 6 +-
gnulib/m4/unistd_h.m4 | 44 +++-
gnulib/m4/wchar.m4 | 25 ++-
gnulib/tests/.cvsignore | 22 ++
gnulib/tests/.gitignore | 29 --
gnulib/tests/Makefile.am | 193 +++++++++++++-
gnulib/tests/dummy.c | 42 ---
gnulib/tests/test-EOVERFLOW.c | 32 ---
gnulib/tests/test-getaddrinfo.c | 2 +-
gnulib/tests/test-sys_select.c | 5 +-
gnulib/tests/test-vc-list-files-cvs.sh | 3 +-
gnulib/tests/test-vc-list-files-git.sh | 3 +-
gnulib/tests/test-wchar.c | 6 +-
qemud/qemud.c | 2 +-
src/remote_internal.c | 2 +-
59 files changed, 2191 insertions(+), 982 deletions(-)
delete mode 100644 .gitignore
delete mode 100644 gnulib/lib/.gitignore
delete mode 100644 gnulib/lib/getaddrinfo.h
delete mode 100644 gnulib/m4/eoverflow.m4
delete mode 100644 gnulib/tests/.gitignore
delete mode 100644 gnulib/tests/dummy.c
delete mode 100644 gnulib/tests/test-EOVERFLOW.c
...
diff --git a/qemud/qemud.c b/qemud/qemud.c
index 9da27d2..db1a107 100644
--- a/qemud/qemud.c
+++ b/qemud/qemud.c
@@ -47,11 +47,11 @@
#include <fnmatch.h>
#include <grp.h>
#include <signal.h>
+#include <netdb.h>
#include "internal.h"
#include "qemud.h"
-#include "getaddrinfo.h"
#include "util.h"
#include "remote_internal.h"
#include "conf.h"
diff --git a/src/remote_internal.c b/src/remote_internal.c
index 35b7b4b..47a86f0 100644
--- a/src/remote_internal.c
+++ b/src/remote_internal.c
@@ -58,7 +58,7 @@
#endif
#include <libxml/uri.h>
-#include "getaddrinfo.h"
+#include <netdb.h>
/* AI_ADDRCONFIG is missing on some systems. */
#ifndef AI_ADDRCONFIG
--
1.6.0.2.588.g3102
>From a353993bd18f16ff049839b8ae72c835b04c05ab Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Wed, 22 Oct 2008 17:06:48 +0200
Subject: [PATCH 2/2] update .cvsignore files; regenerate .gitignore from them
---
.cvsignore | 39 +++++++++++++++++++---------------
.gitignore | 37 +++++++++++++++++++++++++++++++++
gnulib/lib/.gitignore | 29 ++++++++++++++++++++++++++
gnulib/tests/.cvsignore | 49 ++++++++++++++++++++++---------------------
gnulib/tests/.gitignore | 52 +++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 165 insertions(+), 41 deletions(-)
create mode 100644 .gitignore
create mode 100644 gnulib/lib/.gitignore
create mode 100644 gnulib/tests/.gitignore
diff --git a/.cvsignore b/.cvsignore
index eded526..ecb8bf0 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -1,32 +1,37 @@
+*.a
+*.o
+*.orig
...
2
1
Hi,
I trying to install libvirt-cim in my ubuntu-xen-3.2.1 machine. I am able to
install all dependencies and libvirt-cim , but when I run cimtest which has
given in libvirt.org, I am getting following error message
* Starting test suite: libvirt-cim
ERROR - Failed to create Virtual Network 'cimtest-networkpool'
Unable to create network pool cimtest-networkpool
Please check your environment.*
Is there any special networking setup is require to run cimtest.
Any help would be appreciated. Apologies if this topic has been covered
already. I can't find it anywhere using Google
Thanks,
seenu.
2
1
Hi,
I am interested to find out how libvirt envisions image locking.
i.e., how do we make sure multiple nodes are not trying to access the
same storage volume, probably causing image corruption.
I know this can be solved by means of a cluster, but it seems excessive
(and not possible in all scenarios).
Central administration (ovirt-like) is also problematic, since unless
fencing is assumed, it cannot verify the image is no longer being used.
If the image/storage volume could be locked (or leased lock), either by
the storage/LVM/NFS preventing from a node access to a specific image,
or by having libvirt/qemu mutually check the lock before accessing it
(very simply, in leased lock we can check every X minutes, and kill the
process to make sure it honors the lock).
Any thoughts on the subject?
Thanks,
Itamar
4
11
I keep getting the following error when trying to build via a
'sudo make rpm' on the tip of the tree
+ /usr/lib/rpm/find-lang.sh /var/tmp/libvirt-0.4.6-1.fc9-root libvirt
No translations found for libvirt in /var/tmp/libvirt-0.4.6-1.fc9-root
error: Bad exit status from /var/tmp/rpm-tmp.82848 (%install)
RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.82848 (%install)
make: *** [rpm] Error 1
This looks like it came in with one of Jim Meyering's latest checkins.
I'm wondering if I'm doing something wrong - or if I'm missing a build
dependency that I did not need previously?
Ben Guthro
5
6
The following patch series implements the Events API discussed here previously in this thread:
http://www.redhat.com/archives/libvir-list/2008-September/msg00321.html
http://www.redhat.com/archives/libvir-list/2008-October/msg00245.html and
https://www.redhat.com/archives/libvir-list/2008-October/msg00432.html
Once again, I have broken these into the following patches:
events-01-public-api Changes to libvirt.h, and libvirt.c
events-02-internal-api Changes to internal.h and event code
events-03-qemud Changes to the daemon
events-04-qemud-rpc-protocol Changes to the qemud rpc protocol
events-05-driver.patch Changes to the driver API
events-06-driver-qemu Changes to the qemu driver
events-07-driver-remote Changes to the remote driver
events-08-driver-lxc Minor changes to LXC driver structure to prevent compile errors
events-09-driver-openvz Minor changes to openvz driver structure to prevent compile errors
events-10-driver-test Minor changes to test driver structure to prevent compile errors
events-11-example-testapp Test app, and infrastructure changes for an example dir
events-12-python-ignore.patch Add functions to be ignored, for now
Differences from last submission -
Formatting issues brought up by Daniel V
Some protocol simplifications
General fixes suggested from last time around.
Removal of POLLxxx stuff (this caused a bit of churn)
I think I got them all, but please let me know if I missed something.
Again, domain events are only emitted from qemu/kvm guests.
Ben Guthro
1
0
This set moves the cgroup creation before that of the container process,
thus ensuring that it is put in the cgroup as well. As a result, I noticed
that we need to allow device access to /dev/pts/*, and thus added a cgroup
mechanism to allow a whole major device type. The LXC driver is made to
allow major type 136 as a result.
Note that this doesn't seem to do much to really restrict the container.
While it does prevent them from opening devices other than what are allowed,
the container can still mount (or access) the cgroup filesystem and move
itself out of its own group and into the unrestricted root. Further,
it can just add whitelist entries for the devices it wants to gain access.
I tested code to restrict the devices in the per-driver cgroup, but that
appears to have no effect, because from within the container, I can still
add "b 8:* rwm" to my group's devices.allow and subsequently access SCSI
disks. Even still, this patch set is crucial for proper cgroup membership of
the container children.
3
9
21 Oct '08
Again because of my generic VIR_ENUM_IMPL patch last week, I unwittingly caused
a regression in the storage_backend_logical driver. Previously, if you
submitted logical pool XML that had no <source><format type='lvm2'/> string, it
would just default to VIR_STORAGE_POOL_LOGICAL_LVM2. This would succeed just
fine and go on with life. This is no longer the case, and now XML without the
format tag fails to define. To maintain backwards compatibility with already
existing XML that expects this, add a compatibility wrapper to return
VIR_STORAGE_POOL_LOGICAL_LVM2 on an empty format tag.
Signed-off-by: Chris Lalancette <clalance(a)redhat.com>
2
2
21 Oct '08
Currently, you can define a logical storage pool with something like the following:
<pool type='logical'>
<source>
<name>MyVG</name>
<device name='/dev/sdb'/>
...
However, dumping out the XML for this same storage pool (with, say, virsh
pool-dumpxml), gives:
<pool type='logical'>
<source>
<name>MyVG</name>
<device name='/dev/sdb'>
</device>
To make this more idempotent, do the <device name='/dev/sdb'/> form by default,
and only do the <device>...</device> form if .nfreeExtent is defined for the
storage pool.
Signed-off-by: Chris Lalancette <clalance(a)redhat.com>
2
2
21 Oct '08
Because of my patch last week that converted the various virStorage*FromString
and virStorage*ToString implementations to the generic VIR_ENUM_IMPL, there were
a couple of places that didn't properly set errors when they failed. This patch
fixes these places up. It also adds an additional check in virEnumFromString(),
so that if a NULL type is passed in, it fails instead of SEGV'ing.
Signed-off-by: Chris Lalancette <clalance(a)redhat.com>
2
2
While doing testing on this patch series, I mistakenly added a bogus piece of
storage XML to libvirtd, which was saved in /etc/libvirt/storage. On subsequent
stop/start of libvirtd, because of another bug (fixed in a later patch), an
error wasn't being set properly in an error path, so libvirtd was SEGV'ing in
storage_conf.c:virStoragePoolObjLoad when trying to dereference the NULL err
returned from virGetLastError(). Make this more robust against errors by always
doing "err ? err->message : NULL" in the printf. I looked around the tree and
found a couple of other places that weren't guarded, so this patch fixes them as
well.
Signed-off-by: Chris Lalancette <clalance(a)redhat.com>
2
2
Hi,
this just brings qemudDomainAttachUsbMassstorageDevice in line with the
rest of the code:
* don't allow to add the same target device name more than once
* escape paths for qemu's monitor command
Cheers,
-- Guido
2
2
The following patch series implements the Events API discussed here previously in this thread:
http://www.redhat.com/archives/libvir-list/2008-September/msg00321.html and
http://www.redhat.com/archives/libvir-list/2008-October/msg00245.html
By Daniel B's advice - I have broken this patch into the following:
events-01-public-api Changes to libvirt.h, and libvirt.c
events-02-internal-api Changes to internal.h and event code
events-03-qemud Changes to the daemon
events-04-qemud-rpc-protocol Changes to the qemud rpc protocol
events-05-driver.patch Changes to the driver API
events-06-driver-qemu Changes to the qemu driver
events-07-driver-remote Changes to the remote driver
events-08-driver-lxc Minor changes to LXC driver structure to prevent compile errors
events-09-driver-openvz Minor changes to openvz driver structure to prevent compile errors
events-10-driver-test Minor changes to test driver structure to prevent compile errors
events-11-example-testapp Test app, and infrastructure changes for an example dir
events-12-python-ignore.patch Add functions to be ignored, for now
For now, domain events are only emitted from qemu/kvm guests.
5
31
[libvirt] [PATCH 5/5]: Export <device> when doing logical pool discovery
by Chris Lalancette 21 Oct '08
by Chris Lalancette 21 Oct '08
21 Oct '08
When doing logical pool discovery, it currently returns XML like:
<sources><source><name>myvg</name></source></sources>
However, for oVirt, we need to know the device name that corresponds to this
logical volume group as well. Therefore, extend the
virStorageBackendLogicalFindPoolSources function to return this information as
well. This required pretty much a complete rewrite of the discovery function,
since I needed to be able to add <device> sections to already existing XML
nodes. For that reason, this code uses direct libxml2 tree API's to handle the
parsing and the adding of nodes where necessary.
Signed-off-by: Chris Lalancette <clalance(a)redhat.com>
2
1
All,
This series of 5 patches fixes a couple of issues with the logical backend
implementation, and also extends the xml returned by
find-storage-pool-sources-as logical to also return the <device>'s that a
logical backend is made of. Patches 1 - 4 do the cleanup, while patch 5
implements the <device> addition to the find-storage-pool-sources.
--
Chris Lalancette
1
0
Just wanted to give a heads up that the LXC driver spits a warning when
compiling on i686; the exact warning is:
gcc -DHAVE_CONFIG_H -I. -I.. -I../gnulib/lib -I../gnulib/lib -I../include
-I../include -I../qemud -I/usr/include/libxml2 -DBINDIR=\"/usr/libexec\"
-DSBINDIR=\"/usr/sbin\" -DSYSCONF_DIR=\"/etc\"
-DLOCALEBASEDIR=\"/usr/share/locale\" -DLOCAL_STATE_DIR=\"/var\"
-DGETTEXT_PACKAGE=\"libvirt\" -Wall -Wformat -Wformat-security
-Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wextra -Wshadow
-Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Winline
-Wredundant-decls -Wno-sign-compare -Wp,-D_FORTIFY_SOURCE=2 -fexceptions
-fasynchronous-unwind-tables -DWITH_OPENVZ -DWITH_LXC -DWITH_QEMU -DWITH_TEST
-DWITH_REMOTE -DWITH_LIBVIRTD -DWITH_XEN -DIN_LIBVIRT -g -O2 -MT
libvirt_la-lxc_driver.lo -MD -MP -MF .deps/libvirt_la-lxc_driver.Tpo -c
lxc_driver.c -fPIC -DPIC -o .libs/libvirt_la-lxc_driver.o
lxc_driver.c: In function 'lxcGetSchedulerParameters':
lxc_driver.c:1211: warning: dereferencing type-punned pointer will break
strict-aliasing rules
Generally I would go and fix such things, but I didn't spend any time to look at
the code, and I don't have an LXC environment handy to test on, so I didn't want
to break anything. I just thought I would point it out.
--
Chris Lalancette
1
0
21 Oct '08
This patch series is derived from Anton Protopopov /Evgeniy Sokolov
bridge device patches. It first does some generic refactoring of MAC
address handler in all drivers, then adds code to extract openvz version
number, then does network config, and finally does filesystem config.
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
4
18
Hello,
I have a simple question raised yesterday.
CIM(Common Information Model) is a kind of good I/F
(to support VMware, Hyper-V and other platform).
As a CIM Provider, libvirt-cim is going on.
But for CIM Client, Is not going on.
Is there any reason for not supporting CIM on libvirt driver layer?
I am thinking about cim-xml driver (like remote driver) in libvirt.
Ref.
http://www.dmtf.org/standards/wbem
http://en.wikipedia.org/wiki/Web-Based_Enterprise_Management
Thanks
Atsushi SAKAI
4
7
20 Oct '08
In the libvirtd daemon, remote.c file the current RPC handlers have
a return value contract saying
0 - success
-1 - failure in libvirt call, no error returned
-2 - failure in dispatch process, error already serialized & sent
While this isn't a problem for the code as it stands today, for the thread
support I want to be able to avoid the dispatch handlers having to touch
the 'struct qemud_client' object in normal usage. Allowing the RPC
handlers to directly serialize & send the error makes this impossible
because it requires access to the client object.
So this patch changes the way the RPC handlers deal with errors. The
RPC handler API changes from
typedef int (*dispatch_fn) (struct qemud_server *server,
struct qemud_client *client,
dispatch_args *args,
dispatch_ret *ret);
To
typedef int (*dispatch_fn) (struct qemud_server *server,
struct qemud_client *client,
remote_error *err,
dispatch_args *args,
dispatch_ret *ret);
Note, the addition of a 'remote_error *err' argument. Whenever an error
occurs during the dispatch process, the RPC handler must populate this
'remote_error *err' object with the error details. This rule applies
whether its a libvirt error, or a dispatch process error, so there is
no longer any need to have separate -1 or -2 return values, a simple
-1 or 0 return value suffices.
qemud/qemud.c | 12
qemud/qemud.h | 5
qemud/remote.c | 1450 +++++++++++++++++++------------------
qemud/remote_dispatch_prototypes.h | 208 ++---
qemud/remote_generate_stubs.pl | 2
src/domain_conf.c | 8
6 files changed, 896 insertions(+), 789 deletions(-)
This is a rather ugly / unreadable patch I'm afraid - its worth also
looking at the complete before & after code to understand it better.
Daniel
diff --git a/qemud/qemud.c b/qemud/qemud.c
--- a/qemud/qemud.c
+++ b/qemud/qemud.c
@@ -1324,13 +1324,12 @@ static int qemudClientRead(struct qemud_
static void qemudDispatchClientRead(struct qemud_server *server, struct qemud_client *client) {
-
+ unsigned int len;
/*qemudDebug ("qemudDispatchClientRead: mode = %d", client->mode);*/
switch (client->mode) {
case QEMUD_MODE_RX_HEADER: {
XDR x;
- unsigned int len;
if (qemudClientRead(server, client) < 0)
return; /* Error, or blocking */
@@ -1381,7 +1380,14 @@ static void qemudDispatchClientRead(stru
if (client->bufferOffset < client->bufferLength)
return; /* Not read enough */
- remoteDispatchClientRequest (server, client);
+ if ((len = remoteDispatchClientRequest (server, client)) == 0)
+ qemudDispatchClientFailure(server, client);
+
+ /* Set up the output buffer. */
+ client->mode = QEMUD_MODE_TX_PACKET;
+ client->bufferLength = len;
+ client->bufferOffset = 0;
+
if (qemudRegisterClientEvent(server, client, 1) < 0)
qemudDispatchClientFailure(server, client);
diff --git a/qemud/qemud.h b/qemud/qemud.h
--- a/qemud/qemud.h
+++ b/qemud/qemud.h
@@ -174,8 +174,9 @@ void qemudLog(int priority, const char *
#define qemudDebug(fmt, ...) do {} while(0)
#endif
-void remoteDispatchClientRequest (struct qemud_server *server,
- struct qemud_client *client);
+unsigned int
+remoteDispatchClientRequest (struct qemud_server *server,
+ struct qemud_client *client);
#if HAVE_POLKIT
int qemudGetSocketIdentity(int fd, uid_t *uid, pid_t *pid);
diff --git a/qemud/remote.c b/qemud/remote.c
--- a/qemud/remote.c
+++ b/qemud/remote.c
@@ -54,10 +54,9 @@
#define REMOTE_DEBUG(fmt,...) qemudDebug("REMOTE: " fmt, __VA_ARGS__)
-static void remoteDispatchError (struct qemud_client *client,
- remote_message_header *req,
- const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf, 3, 4);
+static void remoteDispatchFormatError (remote_error *rerr,
+ const char *fmt, ...)
+ ATTRIBUTE_FORMAT(printf, 2, 3);
static virDomainPtr get_nonnull_domain (virConnectPtr conn, remote_nonnull_domain domain);
static virNetworkPtr get_nonnull_network (virConnectPtr conn, remote_nonnull_network network);
static virStoragePoolPtr get_nonnull_storage_pool (virConnectPtr conn, remote_nonnull_storage_pool pool);
@@ -80,7 +79,7 @@ typedef union {
typedef int (*dispatch_fn) (struct qemud_server *server,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *err,
dispatch_args *args,
dispatch_ret *ret);
@@ -94,59 +93,151 @@ static const dispatch_data const dispatc
#include "remote_dispatch_table.h"
};
+
+/* Convert a libvirt virError object into wire format */
+static void
+remoteDispatchCopyError (remote_error *rerr,
+ virErrorPtr verr)
+{
+ rerr->code = verr->code;
+ rerr->domain = verr->domain;
+ rerr->message = verr->message ? malloc(sizeof(char*)) : NULL;
+ if (rerr->message) *rerr->message = strdup(verr->message);
+ rerr->level = verr->level;
+ rerr->str1 = verr->str1 ? malloc(sizeof(char*)) : NULL;
+ if (rerr->str1) *rerr->str1 = strdup(verr->str1);
+ rerr->str2 = verr->str2 ? malloc(sizeof(char*)) : NULL;
+ if (rerr->str2) *rerr->str2 = strdup(verr->str2);
+ rerr->str3 = verr->str3 ? malloc(sizeof(char*)) : NULL;
+ if (rerr->str3) *rerr->str3 = strdup(verr->str3);
+ rerr->int1 = verr->int1;
+ rerr->int2 = verr->int2;
+}
+
+
+/* A set of helpers for sending back errors to client
+ in various ways .... */
+
+static void
+remoteDispatchStringError (remote_error *rerr,
+ int code, const char *msg)
+{
+ virError verr;
+
+ memset(&verr, 0, sizeof verr);
+
+ /* Construct the dummy libvirt virError. */
+ verr.code = code;
+ verr.domain = VIR_FROM_REMOTE;
+ verr.message = (char *)msg;
+ verr.level = VIR_ERR_ERROR;
+ verr.str1 = (char *)msg;
+
+ remoteDispatchCopyError(rerr, &verr);
+}
+
+static void
+remoteDispatchAuthError (remote_error *rerr)
+{
+ remoteDispatchStringError (rerr, VIR_ERR_AUTH_FAILED, "authentication failed");
+}
+
+static void
+remoteDispatchFormatError (remote_error *rerr,
+ const char *fmt, ...)
+{
+ va_list args;
+ char msgbuf[1024];
+ char *msg = msgbuf;
+
+ va_start (args, fmt);
+ vsnprintf (msgbuf, sizeof msgbuf, fmt, args);
+ va_end (args);
+
+ remoteDispatchStringError (rerr, VIR_ERR_RPC, msg);
+}
+
+static void
+remoteDispatchGenericError (remote_error *rerr)
+{
+ remoteDispatchStringError(rerr,
+ VIR_ERR_INTERNAL_ERROR,
+ "library function returned error but did not set virterror");
+}
+
+static void
+remoteDispatchOOMError (remote_error *rerr)
+{
+ remoteDispatchStringError(rerr,
+ VIR_ERR_NO_MEMORY,
+ NULL);
+}
+
+static void
+remoteDispatchConnError (remote_error *rerr,
+ virConnectPtr conn)
+{
+ virErrorPtr verr;
+
+ if (conn)
+ verr = virConnGetLastError(conn);
+ else
+ verr = virGetLastError();
+ if (verr)
+ remoteDispatchCopyError(rerr, verr);
+ else
+ remoteDispatchGenericError(rerr);
+}
+
+
/* This function gets called from qemud when it detects an incoming
* remote protocol message. At this point, client->buffer contains
* the full call message (including length word which we skip).
*/
-void
+unsigned int
remoteDispatchClientRequest (struct qemud_server *server,
struct qemud_client *client)
{
XDR xdr;
remote_message_header req, rep;
+ remote_error rerr;
dispatch_args args;
dispatch_ret ret;
const dispatch_data *data = NULL;
- int rv, len;
+ int rv = -1, len;
memset(&args, 0, sizeof args);
memset(&ret, 0, sizeof ret);
+ memset(&rerr, 0, sizeof rerr);
/* Parse the header. */
xdrmem_create (&xdr, client->buffer, client->bufferLength, XDR_DECODE);
- if (!xdr_remote_message_header (&xdr, &req)) {
- remoteDispatchError (client, NULL, "%s", _("xdr_remote_message_header"));
- xdr_destroy (&xdr);
- return;
- }
+ if (!xdr_remote_message_header (&xdr, &req))
+ goto fatal_error;
/* Check version, etc. */
if (req.prog != REMOTE_PROGRAM) {
- remoteDispatchError (client, &req,
- _("program mismatch (actual %x, expected %x)"),
- req.prog, REMOTE_PROGRAM);
- xdr_destroy (&xdr);
- return;
+ remoteDispatchFormatError (&rerr,
+ _("program mismatch (actual %x, expected %x)"),
+ req.prog, REMOTE_PROGRAM);
+ goto rpc_error;
}
if (req.vers != REMOTE_PROTOCOL_VERSION) {
- remoteDispatchError (client, &req,
- _("version mismatch (actual %x, expected %x)"),
- req.vers, REMOTE_PROTOCOL_VERSION);
- xdr_destroy (&xdr);
- return;
+ remoteDispatchFormatError (&rerr,
+ _("version mismatch (actual %x, expected %x)"),
+ req.vers, REMOTE_PROTOCOL_VERSION);
+ goto rpc_error;
}
if (req.direction != REMOTE_CALL) {
- remoteDispatchError (client, &req, _("direction (%d) != REMOTE_CALL"),
- (int) req.direction);
- xdr_destroy (&xdr);
- return;
+ remoteDispatchFormatError (&rerr, _("direction (%d) != REMOTE_CALL"),
+ (int) req.direction);
+ goto rpc_error;
}
if (req.status != REMOTE_OK) {
- remoteDispatchError (client, &req, _("status (%d) != REMOTE_OK"),
- (int) req.status);
- xdr_destroy (&xdr);
- return;
+ remoteDispatchFormatError (&rerr, _("status (%d) != REMOTE_OK"),
+ (int) req.status);
+ goto rpc_error;
}
/* If client is marked as needing auth, don't allow any RPC ops,
@@ -159,47 +250,35 @@ remoteDispatchClientRequest (struct qemu
req.proc != REMOTE_PROC_AUTH_SASL_STEP &&
req.proc != REMOTE_PROC_AUTH_POLKIT
) {
- remoteDispatchError (client, &req, "%s", _("authentication required"));
- xdr_destroy (&xdr);
- return;
+ /* Explicitly *NOT* calling remoteDispatchAuthError() because
+ we want back-compatability with libvirt clients which don't
+ support the VIR_ERR_AUTH_FAILED error code */
+ remoteDispatchFormatError (&rerr, "%s", _("authentication required"));
+ goto rpc_error;
}
}
if (req.proc >= ARRAY_CARDINALITY(dispatch_table) ||
dispatch_table[req.proc].fn == NULL) {
- remoteDispatchError (client, &req, _("unknown procedure: %d"),
- req.proc);
- xdr_destroy (&xdr);
- return;
+ remoteDispatchFormatError (&rerr, _("unknown procedure: %d"),
+ req.proc);
+ goto rpc_error;
}
data = &(dispatch_table[req.proc]);
/* De-serialize args off the wire */
if (!((data->args_filter)(&xdr, &args))) {
- remoteDispatchError (client, &req, "%s", _("parse args failed"));
- xdr_destroy (&xdr);
+ remoteDispatchFormatError (&rerr, "%s", _("parse args failed"));
+ goto rpc_error;
}
- xdr_destroy (&xdr);
-
/* Call function. */
- rv = (data->fn)(server, client, &req, &args, &ret);
+ rv = (data->fn)(server, client, &rerr, &args, &ret);
xdr_free (data->args_filter, (char*)&args);
- /* Dispatch function must return -2, -1 or 0. Anything else is
- * an internal error.
- */
- if (rv < -2 || rv > 0) {
- remoteDispatchError (client, &req,
- _("internal error - dispatch function returned invalid code %d"), rv);
- return;
- }
-
- /* Dispatch error? If so then the function has already set up the
- * return buffer, so just return immediately.
- */
- if (rv == -2) return;
+rpc_error:
+ xdr_destroy (&xdr);
/* Return header. */
rep.prog = req.prog;
@@ -207,226 +286,61 @@ remoteDispatchClientRequest (struct qemu
rep.proc = req.proc;
rep.direction = REMOTE_REPLY;
rep.serial = req.serial;
- rep.status = rv == 0 ? REMOTE_OK : REMOTE_ERROR;
+ rep.status = rv < 0 ? REMOTE_ERROR : REMOTE_OK;
/* Serialise the return header. */
xdrmem_create (&xdr, client->buffer, sizeof client->buffer, XDR_ENCODE);
len = 0; /* We'll come back and write this later. */
if (!xdr_int (&xdr, &len)) {
- remoteDispatchError (client, &req, "%s", _("dummy length"));
- xdr_destroy (&xdr);
if (rv == 0) xdr_free (data->ret_filter, (char*)&ret);
- return;
+ goto fatal_error;
}
if (!xdr_remote_message_header (&xdr, &rep)) {
- remoteDispatchError (client, &req, "%s", _("serialise reply header"));
- xdr_destroy (&xdr);
if (rv == 0) xdr_free (data->ret_filter, (char*)&ret);
- return;
+ goto fatal_error;
}
/* If OK, serialise return structure, if error serialise error. */
- if (rv == 0) {
- if (!((data->ret_filter) (&xdr, &ret))) {
- remoteDispatchError (client, &req, "%s", _("serialise return struct"));
- xdr_destroy (&xdr);
- return;
- }
+ if (rv >= 0) {
+ if (!((data->ret_filter) (&xdr, &ret)))
+ goto fatal_error;
xdr_free (data->ret_filter, (char*)&ret);
} else /* error */ {
- virErrorPtr verr;
- remote_error error;
- remote_nonnull_domain dom;
- remote_nonnull_network net;
-
- verr = client->conn
- ? virConnGetLastError (client->conn)
- : virGetLastError ();
-
- if (verr) {
- error.code = verr->code;
- error.domain = verr->domain;
- error.message = verr->message ? &verr->message : NULL;
- error.level = verr->level;
- if (verr->dom) {
- dom.name = verr->dom->name;
- memcpy (dom.uuid, verr->dom->uuid, VIR_UUID_BUFLEN);
- dom.id = verr->dom->id;
- }
- error.dom = verr->dom ? &dom : NULL;
- error.str1 = verr->str1 ? &verr->str1 : NULL;
- error.str2 = verr->str2 ? &verr->str2 : NULL;
- error.str3 = verr->str3 ? &verr->str3 : NULL;
- error.int1 = verr->int1;
- error.int2 = verr->int2;
- if (verr->net) {
- net.name = verr->net->name;
- memcpy (net.uuid, verr->net->uuid, VIR_UUID_BUFLEN);
- }
- error.net = verr->net ? &net : NULL;
- } else {
- /* Error was NULL so synthesize an error. */
- char msgbuf[] = "remoteDispatchClientRequest: internal error: library function returned error but did not set virterror";
- char *msg = msgbuf;
-
- error.code = VIR_ERR_RPC;
- error.domain = VIR_FROM_REMOTE;
- error.message = &msg;
- error.level = VIR_ERR_ERROR;
- error.dom = NULL;
- error.str1 = &msg;
- error.str2 = NULL;
- error.str3 = NULL;
- error.int1 = 0;
- error.int2 = 0;
- error.net = NULL;
- }
-
- if (!xdr_remote_error (&xdr, &error)) {
- remoteDispatchError (client, &req, "%s", _("serialise return error"));
- xdr_destroy (&xdr);
- return;
- }
+ /* Error was NULL so synthesize an error. */
+ if (rerr.code == 0)
+ remoteDispatchGenericError(&rerr);
+ if (!xdr_remote_error (&xdr, &rerr))
+ goto fatal_error;
}
/* Write the length word. */
len = xdr_getpos (&xdr);
- if (xdr_setpos (&xdr, 0) == 0) {
- remoteDispatchError (client, &req, "%s", _("xdr_setpos"));
- xdr_destroy (&xdr);
- return;
- }
+ if (xdr_setpos (&xdr, 0) == 0)
+ goto fatal_error;
- if (!xdr_int (&xdr, &len)) {
- remoteDispatchError (client, &req, "%s", _("serialise return length"));
- xdr_destroy (&xdr);
- return;
- }
+ if (!xdr_int (&xdr, &len))
+ goto fatal_error;
xdr_destroy (&xdr);
- /* Set up the output buffer. */
- client->mode = QEMUD_MODE_TX_PACKET;
- client->bufferLength = len;
- client->bufferOffset = 0;
+ return len;
+
+fatal_error:
+ /* Seriously bad stuff happened, so we'll kill off this client
+ and not send back any RPC error */
+ xdr_destroy (&xdr);
+ return 0;
}
-
-/* An error occurred during the dispatching process itself (ie. not
- * an error from the function being called). We return an error
- * reply.
- */
-static void
-remoteDispatchSendError (struct qemud_client *client,
- remote_message_header *req,
- int code, const char *msg)
-{
- remote_message_header rep;
- remote_error error;
- XDR xdr;
- int len;
-
- /* Future versions of the protocol may use different vers or prog. Try
- * our hardest to send back a message that such clients could see.
- */
- if (req) {
- rep.prog = req->prog;
- rep.vers = req->vers;
- rep.proc = req->proc;
- rep.direction = REMOTE_REPLY;
- rep.serial = req->serial;
- rep.status = REMOTE_ERROR;
- } else {
- rep.prog = REMOTE_PROGRAM;
- rep.vers = REMOTE_PROTOCOL_VERSION;
- rep.proc = REMOTE_PROC_OPEN;
- rep.direction = REMOTE_REPLY;
- rep.serial = 1;
- rep.status = REMOTE_ERROR;
- }
-
- /* Construct the error. */
- error.code = code;
- error.domain = VIR_FROM_REMOTE;
- error.message = (char**)&msg;
- error.level = VIR_ERR_ERROR;
- error.dom = NULL;
- error.str1 = (char**)&msg;
- error.str2 = NULL;
- error.str3 = NULL;
- error.int1 = 0;
- error.int2 = 0;
- error.net = NULL;
-
- /* Serialise the return header and error. */
- xdrmem_create (&xdr, client->buffer, sizeof client->buffer, XDR_ENCODE);
-
- len = 0; /* We'll come back and write this later. */
- if (!xdr_int (&xdr, &len)) {
- xdr_destroy (&xdr);
- return;
- }
-
- if (!xdr_remote_message_header (&xdr, &rep)) {
- xdr_destroy (&xdr);
- return;
- }
-
- if (!xdr_remote_error (&xdr, &error)) {
- xdr_destroy (&xdr);
- return;
- }
-
- len = xdr_getpos (&xdr);
- if (xdr_setpos (&xdr, 0) == 0) {
- xdr_destroy (&xdr);
- return;
- }
-
- if (!xdr_int (&xdr, &len)) {
- xdr_destroy (&xdr);
- return;
- }
-
- xdr_destroy (&xdr);
-
- /* Send it. */
- client->mode = QEMUD_MODE_TX_PACKET;
- client->bufferLength = len;
- client->bufferOffset = 0;
-}
-
-static void
-remoteDispatchFailAuth (struct qemud_client *client,
- remote_message_header *req)
-{
- remoteDispatchSendError (client, req, VIR_ERR_AUTH_FAILED, "authentication failed");
-}
-
-static void
-remoteDispatchError (struct qemud_client *client,
- remote_message_header *req,
- const char *fmt, ...)
-{
- va_list args;
- char msgbuf[1024];
- char *msg = msgbuf;
-
- va_start (args, fmt);
- vsnprintf (msgbuf, sizeof msgbuf, fmt, args);
- va_end (args);
-
- remoteDispatchSendError (client, req, VIR_ERR_RPC, msg);
-}
-
/*----- Functions. -----*/
static int
remoteDispatchOpen (struct qemud_server *server ATTRIBUTE_UNUSED,
- struct qemud_client *client, remote_message_header *req,
+ struct qemud_client *client,
+ remote_error *rerr,
struct remote_open_args *args, void *ret ATTRIBUTE_UNUSED)
{
const char *name;
@@ -434,8 +348,8 @@ remoteDispatchOpen (struct qemud_server
/* Already opened? */
if (client->conn) {
- remoteDispatchError (client, req, "%s", _("connection already open"));
- return -2;
+ remoteDispatchFormatError (rerr, "%s", _("connection already open"));
+ return -1;
}
name = args->name ? *args->name : NULL;
@@ -451,60 +365,77 @@ remoteDispatchOpen (struct qemud_server
? virConnectOpenReadOnly (name)
: virConnectOpen (name);
- return client->conn ? 0 : -1;
+ if (client->conn == NULL) {
+ remoteDispatchConnError(rerr, NULL);
+ return -1;
+ }
+
+ return 0;
}
#define CHECK_CONN(client) \
if (!client->conn) { \
- remoteDispatchError (client, req, "%s", _("connection not open")); \
- return -2; \
+ remoteDispatchFormatError (rerr, "%s", _("connection not open")); \
+ return -1; \
}
static int
remoteDispatchClose (struct qemud_server *server ATTRIBUTE_UNUSED,
- struct qemud_client *client, remote_message_header *req,
+ struct qemud_client *client,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED, void *ret ATTRIBUTE_UNUSED)
{
- int rv;
CHECK_CONN(client);
- rv = virConnectClose (client->conn);
- if (rv == 0) client->conn = NULL;
+ if (virConnectClose (client->conn) < 0) {
+ remoteDispatchConnError(rerr, NULL);
+ return -1;
+ }
- return rv;
+ client->conn = NULL;
+
+ return 0;
}
static int
remoteDispatchSupportsFeature (struct qemud_server *server ATTRIBUTE_UNUSED,
- struct qemud_client *client, remote_message_header *req,
+ struct qemud_client *client,
+ remote_error *rerr,
remote_supports_feature_args *args, remote_supports_feature_ret *ret)
{
CHECK_CONN(client);
ret->supported = __virDrvSupportsFeature (client->conn, args->feature);
- if (ret->supported == -1) return -1;
+ if (ret->supported == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
static int
remoteDispatchGetType (struct qemud_server *server ATTRIBUTE_UNUSED,
- struct qemud_client *client, remote_message_header *req,
+ struct qemud_client *client,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED, remote_get_type_ret *ret)
{
const char *type;
CHECK_CONN(client);
type = virConnectGetType (client->conn);
- if (type == NULL) return -1;
+ if (type == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
/* We have to strdup because remoteDispatchClientRequest will
* free this string after it's been serialised.
*/
ret->type = strdup (type);
if (!ret->type) {
- remoteDispatchError (client, req, "%s", _("out of memory in strdup"));
- return -2;
+ remoteDispatchFormatError (rerr, "%s", _("out of memory in strdup"));
+ return -1;
}
return 0;
@@ -513,15 +444,17 @@ static int
static int
remoteDispatchGetVersion (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_get_version_ret *ret)
{
unsigned long hvVer;
CHECK_CONN(client);
- if (virConnectGetVersion (client->conn, &hvVer) == -1)
+ if (virConnectGetVersion (client->conn, &hvVer) == -1) {
+ remoteDispatchConnError(rerr, client->conn);
return -1;
+ }
ret->hv_ver = hvVer;
return 0;
@@ -530,7 +463,7 @@ static int
static int
remoteDispatchGetHostname (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_get_hostname_ret *ret)
{
@@ -538,7 +471,10 @@ remoteDispatchGetHostname (struct qemud_
CHECK_CONN(client);
hostname = virConnectGetHostname (client->conn);
- if (hostname == NULL) return -1;
+ if (hostname == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
ret->hostname = hostname;
return 0;
@@ -547,7 +483,7 @@ static int
static int
remoteDispatchGetMaxVcpus (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_get_max_vcpus_args *args,
remote_get_max_vcpus_ret *ret)
{
@@ -556,7 +492,10 @@ remoteDispatchGetMaxVcpus (struct qemud_
type = args->type ? *args->type : NULL;
ret->max_vcpus = virConnectGetMaxVcpus (client->conn, type);
- if (ret->max_vcpus == -1) return -1;
+ if (ret->max_vcpus == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
@@ -564,15 +503,17 @@ static int
static int
remoteDispatchNodeGetInfo (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_node_get_info_ret *ret)
{
virNodeInfo info;
CHECK_CONN(client);
- if (virNodeGetInfo (client->conn, &info) == -1)
+ if (virNodeGetInfo (client->conn, &info) == -1) {
+ remoteDispatchConnError(rerr, client->conn);
return -1;
+ }
memcpy (ret->model, info.model, sizeof ret->model);
ret->memory = info.memory;
@@ -589,7 +530,7 @@ static int
static int
remoteDispatchGetCapabilities (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_get_capabilities_ret *ret)
{
@@ -597,7 +538,10 @@ remoteDispatchGetCapabilities (struct qe
CHECK_CONN(client);
caps = virConnectGetCapabilities (client->conn);
- if (caps == NULL) return -1;
+ if (caps == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
ret->capabilities = caps;
return 0;
@@ -606,22 +550,22 @@ static int
static int
remoteDispatchNodeGetCellsFreeMemory (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_node_get_cells_free_memory_args *args,
remote_node_get_cells_free_memory_ret *ret)
{
CHECK_CONN(client);
if (args->maxCells > REMOTE_NODE_MAX_CELLS) {
- remoteDispatchError (client, req,
- "%s", _("maxCells > REMOTE_NODE_MAX_CELLS"));
- return -2;
+ remoteDispatchFormatError (rerr,
+ "%s", _("maxCells > REMOTE_NODE_MAX_CELLS"));
+ return -1;
}
/* Allocate return buffer. */
if (VIR_ALLOC_N(ret->freeMems.freeMems_val, args->maxCells) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
ret->freeMems.freeMems_len = virNodeGetCellsFreeMemory(client->conn,
@@ -630,6 +574,7 @@ remoteDispatchNodeGetCellsFreeMemory (st
args->maxCells);
if (ret->freeMems.freeMems_len == 0) {
VIR_FREE(ret->freeMems.freeMems_val);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -640,7 +585,7 @@ static int
static int
remoteDispatchNodeGetFreeMemory (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_node_get_free_memory_ret *ret)
{
@@ -648,8 +593,10 @@ remoteDispatchNodeGetFreeMemory (struct
CHECK_CONN(client);
freeMem = virNodeGetFreeMemory(client->conn);
- if (freeMem == 0) return -1;
-
+ if (freeMem == 0) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
ret->freeMem = freeMem;
return 0;
}
@@ -658,7 +605,7 @@ static int
static int
remoteDispatchDomainGetSchedulerType (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_get_scheduler_type_args *args,
remote_domain_get_scheduler_type_ret *ret)
{
@@ -669,13 +616,14 @@ remoteDispatchDomainGetSchedulerType (st
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
type = virDomainGetSchedulerType (dom, &nparams);
if (type == NULL) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -688,7 +636,7 @@ static int
static int
remoteDispatchDomainGetSchedulerParameters (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_get_scheduler_parameters_args *args,
remote_domain_get_scheduler_parameters_ret *ret)
{
@@ -700,25 +648,26 @@ remoteDispatchDomainGetSchedulerParamete
nparams = args->nparams;
if (nparams > REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX) {
- remoteDispatchError (client, req, "%s", _("nparams too large"));
- return -2;
+ remoteDispatchFormatError (rerr, "%s", _("nparams too large"));
+ return -1;
}
if (VIR_ALLOC_N(params, nparams) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
VIR_FREE(params);
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
r = virDomainGetSchedulerParameters (dom, params, &nparams);
if (r == -1) {
virDomainFree(dom);
VIR_FREE(params);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -748,7 +697,7 @@ remoteDispatchDomainGetSchedulerParamete
case VIR_DOMAIN_SCHED_FIELD_BOOLEAN:
ret->params.params_val[i].value.remote_sched_param_value_u.b = params[i].value.b; break;
default:
- remoteDispatchError (client, req, "%s", _("unknown type"));
+ remoteDispatchFormatError (rerr, "%s", _("unknown type"));
goto cleanup;
}
}
@@ -758,19 +707,19 @@ remoteDispatchDomainGetSchedulerParamete
return 0;
oom:
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
+ remoteDispatchOOMError(rerr);
cleanup:
virDomainFree(dom);
for (i = 0 ; i < nparams ; i++)
VIR_FREE(ret->params.params_val[i].field);
VIR_FREE(params);
- return -2;
+ return -1;
}
static int
remoteDispatchDomainSetSchedulerParameters (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_set_scheduler_parameters_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -782,12 +731,12 @@ remoteDispatchDomainSetSchedulerParamete
nparams = args->params.params_len;
if (nparams > REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX) {
- remoteDispatchError (client, req, "%s", _("nparams too large"));
- return -2;
+ remoteDispatchFormatError (rerr, "%s", _("nparams too large"));
+ return -1;
}
if (VIR_ALLOC_N(params, nparams)) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
/* Deserialise parameters. */
@@ -815,14 +764,17 @@ remoteDispatchDomainSetSchedulerParamete
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
VIR_FREE(params);
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
r = virDomainSetSchedulerParameters (dom, params, nparams);
virDomainFree(dom);
VIR_FREE(params);
- if (r == -1) return -1;
+ if (r == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
@@ -830,7 +782,7 @@ static int
static int
remoteDispatchDomainBlockStats (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_block_stats_args *args,
remote_domain_block_stats_ret *ret)
{
@@ -841,13 +793,14 @@ remoteDispatchDomainBlockStats (struct q
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
path = args->path;
if (virDomainBlockStats (dom, path, &stats, sizeof stats) == -1) {
virDomainFree (dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree (dom);
@@ -864,7 +817,7 @@ static int
static int
remoteDispatchDomainInterfaceStats (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_interface_stats_args *args,
remote_domain_interface_stats_ret *ret)
{
@@ -875,13 +828,14 @@ remoteDispatchDomainInterfaceStats (stru
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
path = args->path;
if (virDomainInterfaceStats (dom, path, &stats, sizeof stats) == -1) {
virDomainFree (dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree (dom);
@@ -901,7 +855,7 @@ static int
static int
remoteDispatchDomainBlockPeek (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_block_peek_args *args,
remote_domain_block_peek_ret *ret)
{
@@ -914,8 +868,8 @@ remoteDispatchDomainBlockPeek (struct qe
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
path = args->path;
offset = args->offset;
@@ -924,22 +878,23 @@ remoteDispatchDomainBlockPeek (struct qe
if (size > REMOTE_DOMAIN_BLOCK_PEEK_BUFFER_MAX) {
virDomainFree (dom);
- remoteDispatchError (client, req,
- "%s", _("size > maximum buffer size"));
- return -2;
+ remoteDispatchFormatError (rerr,
+ "%s", _("size > maximum buffer size"));
+ return -1;
}
ret->buffer.buffer_len = size;
if (VIR_ALLOC_N(ret->buffer.buffer_val, size) < 0) {
virDomainFree (dom);
- remoteDispatchError (client, req, "%s", strerror (errno));
- return -2;
+ remoteDispatchFormatError (rerr, "%s", strerror (errno));
+ return -1;
}
if (virDomainBlockPeek (dom, path, offset, size,
ret->buffer.buffer_val, flags) == -1) {
/* free (ret->buffer.buffer_val); - caller frees */
virDomainFree (dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree (dom);
@@ -950,7 +905,7 @@ static int
static int
remoteDispatchDomainMemoryPeek (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_memory_peek_args *args,
remote_domain_memory_peek_ret *ret)
{
@@ -962,31 +917,32 @@ remoteDispatchDomainMemoryPeek (struct q
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
offset = args->offset;
size = args->size;
flags = args->flags;
if (size > REMOTE_DOMAIN_MEMORY_PEEK_BUFFER_MAX) {
- remoteDispatchError (client, req,
- "%s", _("size > maximum buffer size"));
+ remoteDispatchFormatError (rerr,
+ "%s", _("size > maximum buffer size"));
virDomainFree (dom);
- return -2;
+ return -1;
}
ret->buffer.buffer_len = size;
if (VIR_ALLOC_N (ret->buffer.buffer_val, size) < 0) {
- remoteDispatchError (client, req, "%s", strerror (errno));
+ remoteDispatchFormatError (rerr, "%s", strerror (errno));
virDomainFree (dom);
- return -2;
+ return -1;
}
if (virDomainMemoryPeek (dom, offset, size,
ret->buffer.buffer_val, flags) == -1) {
/* free (ret->buffer.buffer_val); - caller frees */
virDomainFree (dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree (dom);
@@ -997,7 +953,7 @@ static int
static int
remoteDispatchDomainAttachDevice (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_attach_device_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1006,12 +962,13 @@ remoteDispatchDomainAttachDevice (struct
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainAttachDevice (dom, args->xml) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1021,7 +978,7 @@ static int
static int
remoteDispatchDomainCreate (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_create_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1030,12 +987,13 @@ remoteDispatchDomainCreate (struct qemud
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainCreate (dom) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1045,7 +1003,7 @@ static int
static int
remoteDispatchDomainCreateXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_create_xml_args *args,
remote_domain_create_xml_ret *ret)
{
@@ -1053,7 +1011,10 @@ remoteDispatchDomainCreateXml (struct qe
CHECK_CONN(client);
dom = virDomainCreateXML (client->conn, args->xml_desc, args->flags);
- if (dom == NULL) return -1;
+ if (dom == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_domain (&ret->dom, dom);
virDomainFree(dom);
@@ -1064,7 +1025,7 @@ static int
static int
remoteDispatchDomainDefineXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_define_xml_args *args,
remote_domain_define_xml_ret *ret)
{
@@ -1072,7 +1033,10 @@ remoteDispatchDomainDefineXml (struct qe
CHECK_CONN(client);
dom = virDomainDefineXML (client->conn, args->xml);
- if (dom == NULL) return -1;
+ if (dom == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_domain (&ret->dom, dom);
virDomainFree(dom);
@@ -1083,7 +1047,7 @@ static int
static int
remoteDispatchDomainDestroy (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_destroy_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1092,12 +1056,13 @@ remoteDispatchDomainDestroy (struct qemu
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainDestroy (dom) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1107,7 +1072,7 @@ static int
static int
remoteDispatchDomainDetachDevice (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_detach_device_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1116,12 +1081,13 @@ remoteDispatchDomainDetachDevice (struct
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainDetachDevice (dom, args->xml) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -1132,7 +1098,7 @@ static int
static int
remoteDispatchDomainDumpXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_dump_xml_args *args,
remote_domain_dump_xml_ret *ret)
{
@@ -1141,15 +1107,16 @@ remoteDispatchDomainDumpXml (struct qemu
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
/* remoteDispatchClientRequest will free this. */
ret->xml = virDomainGetXMLDesc (dom, args->flags);
if (!ret->xml) {
- virDomainFree(dom);
- return -1;
+ virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
virDomainFree(dom);
return 0;
@@ -1158,7 +1125,7 @@ static int
static int
remoteDispatchDomainGetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_get_autostart_args *args,
remote_domain_get_autostart_ret *ret)
{
@@ -1167,12 +1134,13 @@ remoteDispatchDomainGetAutostart (struct
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainGetAutostart (dom, &ret->autostart) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1182,7 +1150,7 @@ static int
static int
remoteDispatchDomainGetInfo (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_get_info_args *args,
remote_domain_get_info_ret *ret)
{
@@ -1192,12 +1160,13 @@ remoteDispatchDomainGetInfo (struct qemu
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainGetInfo (dom, &info) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -1215,7 +1184,7 @@ static int
static int
remoteDispatchDomainGetMaxMemory (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_get_max_memory_args *args,
remote_domain_get_max_memory_ret *ret)
{
@@ -1224,13 +1193,14 @@ remoteDispatchDomainGetMaxMemory (struct
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
ret->memory = virDomainGetMaxMemory (dom);
if (ret->memory == 0) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1240,7 +1210,7 @@ static int
static int
remoteDispatchDomainGetMaxVcpus (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_get_max_vcpus_args *args,
remote_domain_get_max_vcpus_ret *ret)
{
@@ -1249,13 +1219,14 @@ remoteDispatchDomainGetMaxVcpus (struct
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
ret->num = virDomainGetMaxVcpus (dom);
if (ret->num == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1265,7 +1236,7 @@ static int
static int
remoteDispatchDomainGetOsType (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_get_os_type_args *args,
remote_domain_get_os_type_ret *ret)
{
@@ -1274,15 +1245,16 @@ remoteDispatchDomainGetOsType (struct qe
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
/* remoteDispatchClientRequest will free this */
ret->type = virDomainGetOSType (dom);
if (ret->type == NULL) {
- virDomainFree(dom);
- return -1;
+ virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
virDomainFree(dom);
return 0;
@@ -1291,7 +1263,7 @@ static int
static int
remoteDispatchDomainGetVcpus (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_get_vcpus_args *args,
remote_domain_get_vcpus_ret *ret)
{
@@ -1303,20 +1275,20 @@ remoteDispatchDomainGetVcpus (struct qem
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (args->maxinfo > REMOTE_VCPUINFO_MAX) {
virDomainFree(dom);
- remoteDispatchError (client, req, "%s", _("maxinfo > REMOTE_VCPUINFO_MAX"));
- return -2;
+ remoteDispatchFormatError (rerr, "%s", _("maxinfo > REMOTE_VCPUINFO_MAX"));
+ return -1;
}
if (args->maxinfo * args->maplen > REMOTE_CPUMAPS_MAX) {
virDomainFree(dom);
- remoteDispatchError (client, req, "%s", _("maxinfo * maplen > REMOTE_CPUMAPS_MAX"));
- return -2;
+ remoteDispatchFormatError (rerr, "%s", _("maxinfo * maplen > REMOTE_CPUMAPS_MAX"));
+ return -1;
}
/* Allocate buffers to take the results. */
@@ -1332,6 +1304,7 @@ remoteDispatchDomainGetVcpus (struct qem
VIR_FREE(info);
VIR_FREE(cpumaps);
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -1362,14 +1335,14 @@ oom:
VIR_FREE(info);
VIR_FREE(cpumaps);
virDomainFree(dom);
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
static int
remoteDispatchDomainMigratePrepare (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_migrate_prepare_args *args,
remote_domain_migrate_prepare_ret *ret)
{
@@ -1386,8 +1359,8 @@ remoteDispatchDomainMigratePrepare (stru
/* Wacky world of XDR ... */
if (VIR_ALLOC(uri_out) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
r = __virDomainMigratePrepare (client->conn, &cookie, &cookielen,
@@ -1395,6 +1368,7 @@ remoteDispatchDomainMigratePrepare (stru
args->flags, dname, args->resource);
if (r == -1) {
VIR_FREE(uri_out);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -1416,7 +1390,7 @@ static int
static int
remoteDispatchDomainMigratePerform (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_migrate_perform_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1427,8 +1401,8 @@ remoteDispatchDomainMigratePerform (stru
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
dname = args->dname == NULL ? NULL : *args->dname;
@@ -1439,7 +1413,10 @@ remoteDispatchDomainMigratePerform (stru
args->uri,
args->flags, dname, args->resource);
virDomainFree (dom);
- if (r == -1) return -1;
+ if (r == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
@@ -1447,7 +1424,7 @@ static int
static int
remoteDispatchDomainMigrateFinish (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_migrate_finish_args *args,
remote_domain_migrate_finish_ret *ret)
{
@@ -1459,7 +1436,10 @@ remoteDispatchDomainMigrateFinish (struc
args->cookie.cookie_len,
args->uri,
args->flags);
- if (ddom == NULL) return -1;
+ if (ddom == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_domain (&ret->ddom, ddom);
virDomainFree (ddom);
@@ -1469,22 +1449,22 @@ static int
static int
remoteDispatchListDefinedDomains (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_list_defined_domains_args *args,
remote_list_defined_domains_ret *ret)
{
CHECK_CONN(client);
if (args->maxnames > REMOTE_DOMAIN_NAME_LIST_MAX) {
- remoteDispatchError (client, req,
- "%s", _("maxnames > REMOTE_DOMAIN_NAME_LIST_MAX"));
- return -2;
+ remoteDispatchFormatError (rerr,
+ "%s", _("maxnames > REMOTE_DOMAIN_NAME_LIST_MAX"));
+ return -1;
}
/* Allocate return buffer. */
if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
ret->names.names_len =
@@ -1492,6 +1472,7 @@ remoteDispatchListDefinedDomains (struct
ret->names.names_val, args->maxnames);
if (ret->names.names_len == -1) {
VIR_FREE(ret->names.names_val);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -1501,7 +1482,7 @@ static int
static int
remoteDispatchDomainLookupById (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_lookup_by_id_args *args,
remote_domain_lookup_by_id_ret *ret)
{
@@ -1509,7 +1490,10 @@ remoteDispatchDomainLookupById (struct q
CHECK_CONN(client);
dom = virDomainLookupByID (client->conn, args->id);
- if (dom == NULL) return -1;
+ if (dom == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_domain (&ret->dom, dom);
virDomainFree(dom);
@@ -1519,7 +1503,7 @@ static int
static int
remoteDispatchDomainLookupByName (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_lookup_by_name_args *args,
remote_domain_lookup_by_name_ret *ret)
{
@@ -1527,7 +1511,10 @@ remoteDispatchDomainLookupByName (struct
CHECK_CONN(client);
dom = virDomainLookupByName (client->conn, args->name);
- if (dom == NULL) return -1;
+ if (dom == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_domain (&ret->dom, dom);
virDomainFree(dom);
@@ -1537,7 +1524,7 @@ static int
static int
remoteDispatchDomainLookupByUuid (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_lookup_by_uuid_args *args,
remote_domain_lookup_by_uuid_ret *ret)
{
@@ -1545,7 +1532,10 @@ remoteDispatchDomainLookupByUuid (struct
CHECK_CONN(client);
dom = virDomainLookupByUUID (client->conn, (unsigned char *) args->uuid);
- if (dom == NULL) return -1;
+ if (dom == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_domain (&ret->dom, dom);
virDomainFree(dom);
@@ -1555,14 +1545,17 @@ static int
static int
remoteDispatchNumOfDefinedDomains (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_num_of_defined_domains_ret *ret)
{
CHECK_CONN(client);
ret->num = virConnectNumOfDefinedDomains (client->conn);
- if (ret->num == -1) return -1;
+ if (ret->num == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
@@ -1570,7 +1563,7 @@ static int
static int
remoteDispatchDomainPinVcpu (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_pin_vcpu_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1580,14 +1573,14 @@ remoteDispatchDomainPinVcpu (struct qemu
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (args->cpumap.cpumap_len > REMOTE_CPUMAP_MAX) {
virDomainFree(dom);
- remoteDispatchError (client, req, "%s", _("cpumap_len > REMOTE_CPUMAP_MAX"));
- return -2;
+ remoteDispatchFormatError (rerr, "%s", _("cpumap_len > REMOTE_CPUMAP_MAX"));
+ return -1;
}
rv = virDomainPinVcpu (dom, args->vcpu,
@@ -1595,6 +1588,7 @@ remoteDispatchDomainPinVcpu (struct qemu
args->cpumap.cpumap_len);
if (rv == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1604,7 +1598,7 @@ static int
static int
remoteDispatchDomainReboot (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_reboot_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1613,12 +1607,13 @@ remoteDispatchDomainReboot (struct qemud
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainReboot (dom, args->flags) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1628,14 +1623,16 @@ static int
static int
remoteDispatchDomainRestore (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_restore_args *args,
void *ret ATTRIBUTE_UNUSED)
{
CHECK_CONN(client);
- if (virDomainRestore (client->conn, args->from) == -1)
+ if (virDomainRestore (client->conn, args->from) == -1) {
+ remoteDispatchConnError(rerr, client->conn);
return -1;
+ }
return 0;
}
@@ -1643,7 +1640,7 @@ static int
static int
remoteDispatchDomainResume (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_resume_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1652,12 +1649,13 @@ remoteDispatchDomainResume (struct qemud
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainResume (dom) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1667,7 +1665,7 @@ static int
static int
remoteDispatchDomainSave (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_save_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1676,12 +1674,13 @@ remoteDispatchDomainSave (struct qemud_s
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainSave (dom, args->to) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1691,7 +1690,7 @@ static int
static int
remoteDispatchDomainCoreDump (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_core_dump_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1700,12 +1699,13 @@ remoteDispatchDomainCoreDump (struct qem
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainCoreDump (dom, args->to, args->flags) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1715,7 +1715,7 @@ static int
static int
remoteDispatchDomainSetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_set_autostart_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1724,12 +1724,13 @@ remoteDispatchDomainSetAutostart (struct
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainSetAutostart (dom, args->autostart) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1739,7 +1740,7 @@ static int
static int
remoteDispatchDomainSetMaxMemory (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_set_max_memory_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1748,12 +1749,13 @@ remoteDispatchDomainSetMaxMemory (struct
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainSetMaxMemory (dom, args->memory) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1763,7 +1765,7 @@ static int
static int
remoteDispatchDomainSetMemory (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_set_memory_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1772,12 +1774,13 @@ remoteDispatchDomainSetMemory (struct qe
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainSetMemory (dom, args->memory) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1787,7 +1790,7 @@ static int
static int
remoteDispatchDomainSetVcpus (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_set_vcpus_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1796,12 +1799,13 @@ remoteDispatchDomainSetVcpus (struct qem
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainSetVcpus (dom, args->nvcpus) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1811,7 +1815,7 @@ static int
static int
remoteDispatchDomainShutdown (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_shutdown_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1820,12 +1824,13 @@ remoteDispatchDomainShutdown (struct qem
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainShutdown (dom) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1835,7 +1840,7 @@ static int
static int
remoteDispatchDomainSuspend (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_suspend_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1844,12 +1849,13 @@ remoteDispatchDomainSuspend (struct qemu
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainSuspend (dom) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1859,7 +1865,7 @@ static int
static int
remoteDispatchDomainUndefine (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_domain_undefine_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1868,12 +1874,13 @@ remoteDispatchDomainUndefine (struct qem
dom = get_nonnull_domain (client->conn, args->dom);
if (dom == NULL) {
- remoteDispatchError (client, req, "%s", _("domain not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virDomainUndefine (dom) == -1) {
virDomainFree(dom);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virDomainFree(dom);
@@ -1883,22 +1890,22 @@ static int
static int
remoteDispatchListDefinedNetworks (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_list_defined_networks_args *args,
remote_list_defined_networks_ret *ret)
{
CHECK_CONN(client);
if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
- remoteDispatchError (client, req,
- "%s", _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
- return -2;
+ remoteDispatchFormatError (rerr,
+ "%s", _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
+ return -1;
}
/* Allocate return buffer. */
if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
ret->names.names_len =
@@ -1906,6 +1913,7 @@ remoteDispatchListDefinedNetworks (struc
ret->names.names_val, args->maxnames);
if (ret->names.names_len == -1) {
VIR_FREE(ret->names.names_val);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -1915,28 +1923,29 @@ static int
static int
remoteDispatchListDomains (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_list_domains_args *args,
remote_list_domains_ret *ret)
{
CHECK_CONN(client);
if (args->maxids > REMOTE_DOMAIN_ID_LIST_MAX) {
- remoteDispatchError (client, req,
- "%s", _("maxids > REMOTE_DOMAIN_ID_LIST_MAX"));
- return -2;
+ remoteDispatchFormatError (rerr,
+ "%s", _("maxids > REMOTE_DOMAIN_ID_LIST_MAX"));
+ return -1;
}
/* Allocate return buffer. */
if (VIR_ALLOC_N(ret->ids.ids_val, args->maxids) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
ret->ids.ids_len = virConnectListDomains (client->conn,
ret->ids.ids_val, args->maxids);
if (ret->ids.ids_len == -1) {
VIR_FREE(ret->ids.ids_val);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -1946,22 +1955,22 @@ static int
static int
remoteDispatchListNetworks (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_list_networks_args *args,
remote_list_networks_ret *ret)
{
CHECK_CONN(client);
if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
- remoteDispatchError (client, req,
- "%s", _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
- return -2;
+ remoteDispatchFormatError (rerr,
+ "%s", _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
+ return -1;
}
/* Allocate return buffer. */
if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
ret->names.names_len =
@@ -1969,6 +1978,7 @@ remoteDispatchListNetworks (struct qemud
ret->names.names_val, args->maxnames);
if (ret->names.names_len == -1) {
VIR_FREE(ret->names.names_len);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -1978,7 +1988,7 @@ static int
static int
remoteDispatchNetworkCreate (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_create_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -1987,12 +1997,13 @@ remoteDispatchNetworkCreate (struct qemu
net = get_nonnull_network (client->conn, args->net);
if (net == NULL) {
- remoteDispatchError (client, req, "%s", _("network not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virNetworkCreate (net) == -1) {
virNetworkFree(net);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virNetworkFree(net);
@@ -2002,7 +2013,7 @@ static int
static int
remoteDispatchNetworkCreateXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_create_xml_args *args,
remote_network_create_xml_ret *ret)
{
@@ -2010,7 +2021,10 @@ remoteDispatchNetworkCreateXml (struct q
CHECK_CONN(client);
net = virNetworkCreateXML (client->conn, args->xml);
- if (net == NULL) return -1;
+ if (net == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_network (&ret->net, net);
virNetworkFree(net);
@@ -2020,7 +2034,7 @@ static int
static int
remoteDispatchNetworkDefineXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_define_xml_args *args,
remote_network_define_xml_ret *ret)
{
@@ -2028,7 +2042,10 @@ remoteDispatchNetworkDefineXml (struct q
CHECK_CONN(client);
net = virNetworkDefineXML (client->conn, args->xml);
- if (net == NULL) return -1;
+ if (net == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_network (&ret->net, net);
virNetworkFree(net);
@@ -2038,7 +2055,7 @@ static int
static int
remoteDispatchNetworkDestroy (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_destroy_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -2047,12 +2064,13 @@ remoteDispatchNetworkDestroy (struct qem
net = get_nonnull_network (client->conn, args->net);
if (net == NULL) {
- remoteDispatchError (client, req, "%s", _("network not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virNetworkDestroy (net) == -1) {
virNetworkFree(net);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virNetworkFree(net);
@@ -2062,7 +2080,7 @@ static int
static int
remoteDispatchNetworkDumpXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_dump_xml_args *args,
remote_network_dump_xml_ret *ret)
{
@@ -2071,14 +2089,15 @@ remoteDispatchNetworkDumpXml (struct qem
net = get_nonnull_network (client->conn, args->net);
if (net == NULL) {
- remoteDispatchError (client, req, "%s", _("network not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
/* remoteDispatchClientRequest will free this. */
ret->xml = virNetworkGetXMLDesc (net, args->flags);
if (!ret->xml) {
virNetworkFree(net);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virNetworkFree(net);
@@ -2088,7 +2107,7 @@ static int
static int
remoteDispatchNetworkGetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_get_autostart_args *args,
remote_network_get_autostart_ret *ret)
{
@@ -2097,12 +2116,13 @@ remoteDispatchNetworkGetAutostart (struc
net = get_nonnull_network (client->conn, args->net);
if (net == NULL) {
- remoteDispatchError (client, req, "%s", _("network not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virNetworkGetAutostart (net, &ret->autostart) == -1) {
virNetworkFree(net);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virNetworkFree(net);
@@ -2112,7 +2132,7 @@ static int
static int
remoteDispatchNetworkGetBridgeName (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_get_bridge_name_args *args,
remote_network_get_bridge_name_ret *ret)
{
@@ -2121,14 +2141,15 @@ remoteDispatchNetworkGetBridgeName (stru
net = get_nonnull_network (client->conn, args->net);
if (net == NULL) {
- remoteDispatchError (client, req, "%s", _("network not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
/* remoteDispatchClientRequest will free this. */
ret->name = virNetworkGetBridgeName (net);
if (!ret->name) {
virNetworkFree(net);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virNetworkFree(net);
@@ -2138,7 +2159,7 @@ static int
static int
remoteDispatchNetworkLookupByName (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_lookup_by_name_args *args,
remote_network_lookup_by_name_ret *ret)
{
@@ -2146,7 +2167,10 @@ remoteDispatchNetworkLookupByName (struc
CHECK_CONN(client);
net = virNetworkLookupByName (client->conn, args->name);
- if (net == NULL) return -1;
+ if (net == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_network (&ret->net, net);
virNetworkFree(net);
@@ -2156,7 +2180,7 @@ static int
static int
remoteDispatchNetworkLookupByUuid (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_lookup_by_uuid_args *args,
remote_network_lookup_by_uuid_ret *ret)
{
@@ -2164,7 +2188,10 @@ remoteDispatchNetworkLookupByUuid (struc
CHECK_CONN(client);
net = virNetworkLookupByUUID (client->conn, (unsigned char *) args->uuid);
- if (net == NULL) return -1;
+ if (net == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_network (&ret->net, net);
virNetworkFree(net);
@@ -2174,7 +2201,7 @@ static int
static int
remoteDispatchNetworkSetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_set_autostart_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -2183,12 +2210,13 @@ remoteDispatchNetworkSetAutostart (struc
net = get_nonnull_network (client->conn, args->net);
if (net == NULL) {
- remoteDispatchError (client, req, "%s", _("network not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virNetworkSetAutostart (net, args->autostart) == -1) {
virNetworkFree(net);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virNetworkFree(net);
@@ -2198,7 +2226,7 @@ static int
static int
remoteDispatchNetworkUndefine (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_network_undefine_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -2207,12 +2235,13 @@ remoteDispatchNetworkUndefine (struct qe
net = get_nonnull_network (client->conn, args->net);
if (net == NULL) {
- remoteDispatchError (client, req, "%s", _("network not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virNetworkUndefine (net) == -1) {
virNetworkFree(net);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virNetworkFree(net);
@@ -2222,14 +2251,17 @@ static int
static int
remoteDispatchNumOfDefinedNetworks (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_num_of_defined_networks_ret *ret)
{
CHECK_CONN(client);
ret->num = virConnectNumOfDefinedNetworks (client->conn);
- if (ret->num == -1) return -1;
+ if (ret->num == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
@@ -2237,14 +2269,17 @@ static int
static int
remoteDispatchNumOfDomains (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_num_of_domains_ret *ret)
{
CHECK_CONN(client);
ret->num = virConnectNumOfDomains (client->conn);
- if (ret->num == -1) return -1;
+ if (ret->num == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
@@ -2252,14 +2287,17 @@ static int
static int
remoteDispatchNumOfNetworks (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_num_of_networks_ret *ret)
{
CHECK_CONN(client);
ret->num = virConnectNumOfNetworks (client->conn);
- if (ret->num == -1) return -1;
+ if (ret->num == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
@@ -2268,14 +2306,14 @@ static int
static int
remoteDispatchAuthList (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req ATTRIBUTE_UNUSED,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_auth_list_ret *ret)
{
ret->types.types_len = 1;
if (VIR_ALLOC_N(ret->types.types_val, ret->types.types_len) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
ret->types.types_val[0] = client->auth;
return 0;
@@ -2286,8 +2324,7 @@ remoteDispatchAuthList (struct qemud_ser
/*
* NB, keep in sync with similar method in src/remote_internal.c
*/
-static char *addrToString(struct qemud_client *client,
- remote_message_header *req,
+static char *addrToString(remote_error *rerr,
struct sockaddr_storage *sa, socklen_t salen) {
char host[1024], port[20];
char *addr;
@@ -2297,14 +2334,14 @@ static char *addrToString(struct qemud_c
host, sizeof(host),
port, sizeof(port),
NI_NUMERICHOST | NI_NUMERICSERV)) != 0) {
- remoteDispatchError(client, req,
- _("Cannot resolve address %d: %s"),
- err, gai_strerror(err));
+ remoteDispatchFormatError(rerr,
+ _("Cannot resolve address %d: %s"),
+ err, gai_strerror(err));
return NULL;
}
if (VIR_ALLOC_N(addr, strlen(host) + 1 + strlen(port) + 1) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
+ remoteDispatchOOMError(rerr);
return NULL;
}
@@ -2324,7 +2361,7 @@ static int
static int
remoteDispatchAuthSaslInit (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_auth_sasl_init_ret *ret)
{
@@ -2339,33 +2376,33 @@ remoteDispatchAuthSaslInit (struct qemud
if (client->auth != REMOTE_AUTH_SASL ||
client->saslconn != NULL) {
qemudLog(QEMUD_ERR, "%s", _("client tried invalid SASL init request"));
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
/* Get local address in form IPADDR:PORT */
salen = sizeof(sa);
if (getsockname(client->fd, (struct sockaddr*)&sa, &salen) < 0) {
- remoteDispatchError(client, req,
- _("failed to get sock address %d (%s)"),
- errno, strerror(errno));
- return -2;
+ remoteDispatchFormatError(rerr,
+ _("failed to get sock address %d (%s)"),
+ errno, strerror(errno));
+ return -1;
}
- if ((localAddr = addrToString(client, req, &sa, salen)) == NULL) {
- return -2;
+ if ((localAddr = addrToString(rerr, &sa, salen)) == NULL) {
+ return -1;
}
/* Get remote address in form IPADDR:PORT */
salen = sizeof(sa);
if (getpeername(client->fd, (struct sockaddr*)&sa, &salen) < 0) {
- remoteDispatchError(client, req, _("failed to get peer address %d (%s)"),
- errno, strerror(errno));
+ remoteDispatchFormatError(rerr, _("failed to get peer address %d (%s)"),
+ errno, strerror(errno));
VIR_FREE(localAddr);
- return -2;
+ return -1;
}
- if ((remoteAddr = addrToString(client, req, &sa, salen)) == NULL) {
+ if ((remoteAddr = addrToString(rerr, &sa, salen)) == NULL) {
VIR_FREE(localAddr);
- return -2;
+ return -1;
}
err = sasl_server_new("libvirt",
@@ -2381,9 +2418,9 @@ remoteDispatchAuthSaslInit (struct qemud
if (err != SASL_OK) {
qemudLog(QEMUD_ERR, _("sasl context setup failed %d (%s)"),
err, sasl_errstring(err, NULL, NULL));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
client->saslconn = NULL;
- return -2;
+ return -1;
}
/* Inform SASL that we've got an external SSF layer from TLS */
@@ -2394,10 +2431,10 @@ remoteDispatchAuthSaslInit (struct qemud
cipher = gnutls_cipher_get(client->tlssession);
if (!(ssf = (sasl_ssf_t)gnutls_cipher_get_key_size(cipher))) {
qemudLog(QEMUD_ERR, "%s", _("cannot TLS get cipher size"));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
- return -2;
+ return -1;
}
ssf *= 8; /* tls key size is bytes, sasl wants bits */
@@ -2405,10 +2442,10 @@ remoteDispatchAuthSaslInit (struct qemud
if (err != SASL_OK) {
qemudLog(QEMUD_ERR, _("cannot set SASL external SSF %d (%s)"),
err, sasl_errstring(err, NULL, NULL));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
- return -2;
+ return -1;
}
}
@@ -2434,10 +2471,10 @@ remoteDispatchAuthSaslInit (struct qemud
if (err != SASL_OK) {
qemudLog(QEMUD_ERR, _("cannot set SASL security props %d (%s)"),
err, sasl_errstring(err, NULL, NULL));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
- return -2;
+ return -1;
}
err = sasl_listmech(client->saslconn,
@@ -2451,19 +2488,19 @@ remoteDispatchAuthSaslInit (struct qemud
if (err != SASL_OK) {
qemudLog(QEMUD_ERR, _("cannot list SASL mechanisms %d (%s)"),
err, sasl_errdetail(client->saslconn));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
- return -2;
+ return -1;
}
REMOTE_DEBUG("Available mechanisms for client: '%s'", mechlist);
ret->mechlist = strdup(mechlist);
if (!ret->mechlist) {
qemudLog(QEMUD_ERR, "%s", _("cannot allocate mechlist"));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
- return -2;
+ return -1;
}
return 0;
@@ -2474,7 +2511,7 @@ remoteDispatchAuthSaslInit (struct qemud
* got what we asked for */
static int
remoteSASLCheckSSF (struct qemud_client *client,
- remote_message_header *req) {
+ remote_error *rerr) {
const void *val;
int err, ssf;
@@ -2486,7 +2523,7 @@ remoteSASLCheckSSF (struct qemud_client
if (err != SASL_OK) {
qemudLog(QEMUD_ERR, _("cannot query SASL ssf on connection %d (%s)"),
err, sasl_errstring(err, NULL, NULL));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
return -1;
@@ -2495,7 +2532,7 @@ remoteSASLCheckSSF (struct qemud_client
REMOTE_DEBUG("negotiated an SSF of %d", ssf);
if (ssf < 56) { /* 56 is good for Kerberos */
qemudLog(QEMUD_ERR, _("negotiated SSF %d was not strong enough"), ssf);
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
return -1;
@@ -2516,7 +2553,7 @@ static int
static int
remoteSASLCheckAccess (struct qemud_server *server,
struct qemud_client *client,
- remote_message_header *req) {
+ remote_error *rerr) {
const void *val;
int err;
char **wildcards;
@@ -2526,14 +2563,14 @@ remoteSASLCheckAccess (struct qemud_serv
qemudLog(QEMUD_ERR,
_("cannot query SASL username on connection %d (%s)"),
err, sasl_errstring(err, NULL, NULL));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
return -1;
}
if (val == NULL) {
qemudLog(QEMUD_ERR, "%s", _("no client username was found"));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
return -1;
@@ -2543,7 +2580,7 @@ remoteSASLCheckAccess (struct qemud_serv
client->saslUsername = strdup((const char*)val);
if (client->saslUsername == NULL) {
qemudLog(QEMUD_ERR, "%s", _("out of memory copying username"));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
return -1;
@@ -2563,7 +2600,7 @@ remoteSASLCheckAccess (struct qemud_serv
/* Denied */
qemudLog(QEMUD_ERR, _("SASL client %s not allowed in whitelist"),
client->saslUsername);
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
return -1;
@@ -2576,7 +2613,7 @@ static int
static int
remoteDispatchAuthSaslStart (struct qemud_server *server,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_auth_sasl_start_args *args,
remote_auth_sasl_start_ret *ret)
{
@@ -2588,8 +2625,8 @@ remoteDispatchAuthSaslStart (struct qemu
if (client->auth != REMOTE_AUTH_SASL ||
client->saslconn == NULL) {
qemudLog(QEMUD_ERR, "%s", _("client tried invalid SASL start request"));
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
REMOTE_DEBUG("Using SASL mechanism %s. Data %d bytes, nil: %d",
@@ -2607,23 +2644,23 @@ remoteDispatchAuthSaslStart (struct qemu
err, sasl_errdetail(client->saslconn));
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
if (serveroutlen > REMOTE_AUTH_SASL_DATA_MAX) {
qemudLog(QEMUD_ERR, _("sasl start reply data too long %d"),
serveroutlen);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
/* NB, distinction of NULL vs "" is *critical* in SASL */
if (serverout) {
if (VIR_ALLOC_N(ret->data.data_val, serveroutlen) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
memcpy(ret->data.data_val, serverout, serveroutlen);
} else {
@@ -2636,12 +2673,12 @@ remoteDispatchAuthSaslStart (struct qemu
if (err == SASL_CONTINUE) {
ret->complete = 0;
} else {
- if (remoteSASLCheckSSF(client, req) < 0)
- return -2;
+ if (remoteSASLCheckSSF(client, rerr) < 0)
+ return -1;
/* Check username whitelist ACL */
- if (remoteSASLCheckAccess(server, client, req) < 0)
- return -2;
+ if (remoteSASLCheckAccess(server, client, rerr) < 0)
+ return -1;
REMOTE_DEBUG("Authentication successful %d", client->fd);
ret->complete = 1;
@@ -2655,7 +2692,7 @@ static int
static int
remoteDispatchAuthSaslStep (struct qemud_server *server,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_auth_sasl_step_args *args,
remote_auth_sasl_step_ret *ret)
{
@@ -2667,8 +2704,8 @@ remoteDispatchAuthSaslStep (struct qemud
if (client->auth != REMOTE_AUTH_SASL ||
client->saslconn == NULL) {
qemudLog(QEMUD_ERR, "%s", _("client tried invalid SASL start request"));
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
REMOTE_DEBUG("Using SASL Data %d bytes, nil: %d",
@@ -2685,8 +2722,8 @@ remoteDispatchAuthSaslStep (struct qemud
err, sasl_errdetail(client->saslconn));
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
if (serveroutlen > REMOTE_AUTH_SASL_DATA_MAX) {
@@ -2694,15 +2731,15 @@ remoteDispatchAuthSaslStep (struct qemud
serveroutlen);
sasl_dispose(&client->saslconn);
client->saslconn = NULL;
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
/* NB, distinction of NULL vs "" is *critical* in SASL */
if (serverout) {
if (VIR_ALLOC_N(ret->data.data_val, serveroutlen) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
memcpy(ret->data.data_val, serverout, serveroutlen);
} else {
@@ -2715,12 +2752,12 @@ remoteDispatchAuthSaslStep (struct qemud
if (err == SASL_CONTINUE) {
ret->complete = 0;
} else {
- if (remoteSASLCheckSSF(client, req) < 0)
- return -2;
+ if (remoteSASLCheckSSF(client, rerr) < 0)
+ return -1;
/* Check username whitelist ACL */
- if (remoteSASLCheckAccess(server, client, req) < 0)
- return -2;
+ if (remoteSASLCheckAccess(server, client, rerr) < 0)
+ return -1;
REMOTE_DEBUG("Authentication successful %d", client->fd);
ret->complete = 1;
@@ -2735,36 +2772,36 @@ static int
static int
remoteDispatchAuthSaslInit (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_auth_sasl_init_ret *ret ATTRIBUTE_UNUSED)
{
qemudLog(QEMUD_ERR, "%s", _("client tried unsupported SASL init request"));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
return -1;
}
static int
remoteDispatchAuthSaslStart (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_auth_sasl_start_args *args ATTRIBUTE_UNUSED,
remote_auth_sasl_start_ret *ret ATTRIBUTE_UNUSED)
{
qemudLog(QEMUD_ERR, "%s", _("client tried unsupported SASL start request"));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
return -1;
}
static int
remoteDispatchAuthSaslStep (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_auth_sasl_step_args *args ATTRIBUTE_UNUSED,
remote_auth_sasl_step_ret *ret ATTRIBUTE_UNUSED)
{
qemudLog(QEMUD_ERR, "%s", _("client tried unsupported SASL step request"));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
return -1;
}
#endif /* HAVE_SASL */
@@ -2774,7 +2811,7 @@ static int
static int
remoteDispatchAuthPolkit (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_auth_polkit_ret *ret)
{
@@ -2794,14 +2831,14 @@ remoteDispatchAuthPolkit (struct qemud_s
if (client->auth != REMOTE_AUTH_POLKIT) {
qemudLog(QEMUD_ERR,
"%s", _("client tried invalid PolicyKit init request"));
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
if (qemudGetSocketIdentity(client->fd, &callerUid, &callerPid) < 0) {
qemudLog(QEMUD_ERR, "%s", _("cannot get peer socket identity"));
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
qemudLog(QEMUD_INFO, _("Checking PID %d running as %d"),
@@ -2812,16 +2849,16 @@ remoteDispatchAuthPolkit (struct qemud_s
qemudLog(QEMUD_ERR, _("Failed to lookup policy kit caller: %s"),
err.message);
dbus_error_free(&err);
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
if (!(pkaction = polkit_action_new())) {
qemudLog(QEMUD_ERR, _("Failed to create polkit action %s\n"),
strerror(errno));
polkit_caller_unref(pkcaller);
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
polkit_action_set_action_id(pkaction, action);
@@ -2835,8 +2872,8 @@ remoteDispatchAuthPolkit (struct qemud_s
polkit_caller_unref(pkcaller);
polkit_action_unref(pkaction);
dbus_error_free(&err);
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
#if HAVE_POLKIT_CONTEXT_IS_CALLER_AUTHORIZED
@@ -2850,8 +2887,8 @@ remoteDispatchAuthPolkit (struct qemud_s
_("Policy kit failed to check authorization %d %s"),
polkit_error_get_error_code(pkerr),
polkit_error_get_error_message(pkerr));
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
#else
pkresult = polkit_context_can_caller_do_action(pkcontext,
@@ -2867,8 +2904,8 @@ remoteDispatchAuthPolkit (struct qemud_s
" result: %s\n"),
action, callerPid, callerUid,
polkit_result_to_string_representation(pkresult));
- remoteDispatchFailAuth(client, req);
- return -2;
+ remoteDispatchAuthError(rerr);
+ return -1;
}
qemudLog(QEMUD_INFO,
_("Policy allowed action %s from pid %d, uid %d, result %s"),
@@ -2884,14 +2921,14 @@ remoteDispatchAuthPolkit (struct qemud_s
static int
remoteDispatchAuthPolkit (struct qemud_server *server ATTRIBUTE_UNUSED,
- struct qemud_client *client,
- remote_message_header *req,
- void *args ATTRIBUTE_UNUSED,
- remote_auth_polkit_ret *ret ATTRIBUTE_UNUSED)
+ struct qemud_client *client,
+ remote_error *rerr,
+ void *args ATTRIBUTE_UNUSED,
+ remote_auth_polkit_ret *ret ATTRIBUTE_UNUSED)
{
qemudLog(QEMUD_ERR,
"%s", _("client tried unsupported PolicyKit init request"));
- remoteDispatchFailAuth(client, req);
+ remoteDispatchAuthError(rerr);
return -1;
}
#endif /* HAVE_POLKIT */
@@ -2905,22 +2942,22 @@ static int
static int
remoteDispatchListDefinedStoragePools (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_list_defined_storage_pools_args *args,
remote_list_defined_storage_pools_ret *ret)
{
CHECK_CONN(client);
if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
- remoteDispatchError (client, req,
- "%s", _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
- return -2;
+ remoteDispatchFormatError (rerr,
+ "%s", _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
+ return -1;
}
/* Allocate return buffer. */
if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
ret->names.names_len =
@@ -2928,6 +2965,7 @@ remoteDispatchListDefinedStoragePools (s
ret->names.names_val, args->maxnames);
if (ret->names.names_len == -1) {
VIR_FREE(ret->names.names_val);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -2937,22 +2975,22 @@ static int
static int
remoteDispatchListStoragePools (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_list_storage_pools_args *args,
remote_list_storage_pools_ret *ret)
{
CHECK_CONN(client);
if (args->maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) {
- remoteDispatchError (client, req,
- "%s", _("maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX"));
- return -2;
+ remoteDispatchFormatError (rerr,
+ "%s", _("maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX"));
+ return -1;
}
/* Allocate return buffer. */
if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
ret->names.names_len =
@@ -2960,6 +2998,7 @@ remoteDispatchListStoragePools (struct q
ret->names.names_val, args->maxnames);
if (ret->names.names_len == -1) {
VIR_FREE(ret->names.names_val);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -2969,7 +3008,7 @@ static int
static int
remoteDispatchFindStoragePoolSources (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_find_storage_pool_sources_args *args,
remote_find_storage_pool_sources_ret *ret)
{
@@ -2980,8 +3019,10 @@ remoteDispatchFindStoragePoolSources (st
args->type,
args->srcSpec ? *args->srcSpec : NULL,
args->flags);
- if (ret->xml == NULL)
+ if (ret->xml == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
return -1;
+ }
return 0;
}
@@ -2990,7 +3031,7 @@ static int
static int
remoteDispatchStoragePoolCreate (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_create_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -2999,12 +3040,13 @@ remoteDispatchStoragePoolCreate (struct
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStoragePoolCreate (pool, args->flags) == -1) {
virStoragePoolFree(pool);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStoragePoolFree(pool);
@@ -3014,7 +3056,7 @@ static int
static int
remoteDispatchStoragePoolCreateXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_create_xml_args *args,
remote_storage_pool_create_xml_ret *ret)
{
@@ -3022,7 +3064,10 @@ remoteDispatchStoragePoolCreateXml (stru
CHECK_CONN(client);
pool = virStoragePoolCreateXML (client->conn, args->xml, args->flags);
- if (pool == NULL) return -1;
+ if (pool == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_storage_pool (&ret->pool, pool);
virStoragePoolFree(pool);
@@ -3032,7 +3077,7 @@ static int
static int
remoteDispatchStoragePoolDefineXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_define_xml_args *args,
remote_storage_pool_define_xml_ret *ret)
{
@@ -3040,7 +3085,10 @@ remoteDispatchStoragePoolDefineXml (stru
CHECK_CONN(client);
pool = virStoragePoolDefineXML (client->conn, args->xml, args->flags);
- if (pool == NULL) return -1;
+ if (pool == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_storage_pool (&ret->pool, pool);
virStoragePoolFree(pool);
@@ -3049,22 +3097,23 @@ remoteDispatchStoragePoolDefineXml (stru
static int
remoteDispatchStoragePoolBuild (struct qemud_server *server ATTRIBUTE_UNUSED,
- struct qemud_client *client,
- remote_message_header *req,
- remote_storage_pool_build_args *args,
- void *ret ATTRIBUTE_UNUSED)
+ struct qemud_client *client,
+ remote_error *rerr,
+ remote_storage_pool_build_args *args,
+ void *ret ATTRIBUTE_UNUSED)
{
virStoragePoolPtr pool;
CHECK_CONN(client);
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStoragePoolBuild (pool, args->flags) == -1) {
virStoragePoolFree(pool);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStoragePoolFree(pool);
@@ -3075,7 +3124,7 @@ static int
static int
remoteDispatchStoragePoolDestroy (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_destroy_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -3084,12 +3133,13 @@ remoteDispatchStoragePoolDestroy (struct
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStoragePoolDestroy (pool) == -1) {
virStoragePoolFree(pool);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStoragePoolFree(pool);
@@ -3099,7 +3149,7 @@ static int
static int
remoteDispatchStoragePoolDelete (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_delete_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -3108,12 +3158,13 @@ remoteDispatchStoragePoolDelete (struct
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStoragePoolDelete (pool, args->flags) == -1) {
virStoragePoolFree(pool);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStoragePoolFree(pool);
@@ -3123,7 +3174,7 @@ static int
static int
remoteDispatchStoragePoolRefresh (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_refresh_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -3132,12 +3183,13 @@ remoteDispatchStoragePoolRefresh (struct
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStoragePoolRefresh (pool, args->flags) == -1) {
virStoragePoolFree(pool);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStoragePoolFree(pool);
@@ -3147,7 +3199,7 @@ static int
static int
remoteDispatchStoragePoolGetInfo (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_get_info_args *args,
remote_storage_pool_get_info_ret *ret)
{
@@ -3157,12 +3209,13 @@ remoteDispatchStoragePoolGetInfo (struct
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStoragePoolGetInfo (pool, &info) == -1) {
virStoragePoolFree(pool);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -3179,7 +3232,7 @@ static int
static int
remoteDispatchStoragePoolDumpXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_dump_xml_args *args,
remote_storage_pool_dump_xml_ret *ret)
{
@@ -3188,14 +3241,15 @@ remoteDispatchStoragePoolDumpXml (struct
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
/* remoteDispatchClientRequest will free this. */
ret->xml = virStoragePoolGetXMLDesc (pool, args->flags);
if (!ret->xml) {
virStoragePoolFree(pool);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStoragePoolFree(pool);
@@ -3205,7 +3259,7 @@ static int
static int
remoteDispatchStoragePoolGetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_get_autostart_args *args,
remote_storage_pool_get_autostart_ret *ret)
{
@@ -3214,12 +3268,13 @@ remoteDispatchStoragePoolGetAutostart (s
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStoragePoolGetAutostart (pool, &ret->autostart) == -1) {
virStoragePoolFree(pool);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStoragePoolFree(pool);
@@ -3230,7 +3285,7 @@ static int
static int
remoteDispatchStoragePoolLookupByName (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_lookup_by_name_args *args,
remote_storage_pool_lookup_by_name_ret *ret)
{
@@ -3238,7 +3293,10 @@ remoteDispatchStoragePoolLookupByName (s
CHECK_CONN(client);
pool = virStoragePoolLookupByName (client->conn, args->name);
- if (pool == NULL) return -1;
+ if (pool == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_storage_pool (&ret->pool, pool);
virStoragePoolFree(pool);
@@ -3248,7 +3306,7 @@ static int
static int
remoteDispatchStoragePoolLookupByUuid (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_lookup_by_uuid_args *args,
remote_storage_pool_lookup_by_uuid_ret *ret)
{
@@ -3256,7 +3314,10 @@ remoteDispatchStoragePoolLookupByUuid (s
CHECK_CONN(client);
pool = virStoragePoolLookupByUUID (client->conn, (unsigned char *) args->uuid);
- if (pool == NULL) return -1;
+ if (pool == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_storage_pool (&ret->pool, pool);
virStoragePoolFree(pool);
@@ -3266,7 +3327,7 @@ static int
static int
remoteDispatchStoragePoolLookupByVolume (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_lookup_by_volume_args *args,
remote_storage_pool_lookup_by_volume_ret *ret)
{
@@ -3275,10 +3336,17 @@ remoteDispatchStoragePoolLookupByVolume
CHECK_CONN(client);
vol = get_nonnull_storage_vol (client->conn, args->vol);
+ if (vol == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
pool = virStoragePoolLookupByVolume (vol);
virStorageVolFree(vol);
- if (pool == NULL) return -1;
+ if (pool == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_storage_pool (&ret->pool, pool);
virStoragePoolFree(pool);
@@ -3288,7 +3356,7 @@ static int
static int
remoteDispatchStoragePoolSetAutostart (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_set_autostart_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -3297,12 +3365,13 @@ remoteDispatchStoragePoolSetAutostart (s
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStoragePoolSetAutostart (pool, args->autostart) == -1) {
virStoragePoolFree(pool);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStoragePoolFree(pool);
@@ -3312,7 +3381,7 @@ static int
static int
remoteDispatchStoragePoolUndefine (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_undefine_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -3321,12 +3390,13 @@ remoteDispatchStoragePoolUndefine (struc
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStoragePoolUndefine (pool) == -1) {
virStoragePoolFree(pool);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStoragePoolFree(pool);
@@ -3336,14 +3406,17 @@ static int
static int
remoteDispatchNumOfStoragePools (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_num_of_storage_pools_ret *ret)
{
CHECK_CONN(client);
ret->num = virConnectNumOfStoragePools (client->conn);
- if (ret->num == -1) return -1;
+ if (ret->num == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
@@ -3351,14 +3424,17 @@ static int
static int
remoteDispatchNumOfDefinedStoragePools (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
void *args ATTRIBUTE_UNUSED,
remote_num_of_defined_storage_pools_ret *ret)
{
CHECK_CONN(client);
ret->num = virConnectNumOfDefinedStoragePools (client->conn);
- if (ret->num == -1) return -1;
+ if (ret->num == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
@@ -3366,7 +3442,7 @@ static int
static int
remoteDispatchStoragePoolListVolumes (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_list_volumes_args *args,
remote_storage_pool_list_volumes_ret *ret)
{
@@ -3374,22 +3450,22 @@ remoteDispatchStoragePoolListVolumes (st
CHECK_CONN(client);
if (args->maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX) {
- remoteDispatchError (client, req,
- "%s", _("maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX"));
- return -2;
+ remoteDispatchFormatError (rerr,
+ "%s", _("maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX"));
+ return -1;
}
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
/* Allocate return buffer. */
if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
virStoragePoolFree(pool);
- remoteDispatchSendError(client, req, VIR_ERR_NO_MEMORY, NULL);
- return -2;
+ remoteDispatchOOMError(rerr);
+ return -1;
}
ret->names.names_len =
@@ -3398,6 +3474,7 @@ remoteDispatchStoragePoolListVolumes (st
virStoragePoolFree(pool);
if (ret->names.names_len == -1) {
VIR_FREE(ret->names.names_val);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -3408,7 +3485,7 @@ static int
static int
remoteDispatchStoragePoolNumOfVolumes (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_pool_num_of_volumes_args *args,
remote_storage_pool_num_of_volumes_ret *ret)
{
@@ -3417,13 +3494,16 @@ remoteDispatchStoragePoolNumOfVolumes (s
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
ret->num = virStoragePoolNumOfVolumes (pool);
virStoragePoolFree(pool);
- if (ret->num == -1) return -1;
+ if (ret->num == -1) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
return 0;
}
@@ -3438,7 +3518,7 @@ static int
static int
remoteDispatchStorageVolCreateXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_vol_create_xml_args *args,
remote_storage_vol_create_xml_ret *ret)
{
@@ -3448,13 +3528,16 @@ remoteDispatchStorageVolCreateXml (struc
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
vol = virStorageVolCreateXML (pool, args->xml, args->flags);
virStoragePoolFree(pool);
- if (vol == NULL) return -1;
+ if (vol == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_storage_vol (&ret->vol, vol);
virStorageVolFree(vol);
@@ -3465,7 +3548,7 @@ static int
static int
remoteDispatchStorageVolDelete (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_vol_delete_args *args,
void *ret ATTRIBUTE_UNUSED)
{
@@ -3474,12 +3557,13 @@ remoteDispatchStorageVolDelete (struct q
vol = get_nonnull_storage_vol (client->conn, args->vol);
if (vol == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_vol not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStorageVolDelete (vol, args->flags) == -1) {
virStorageVolFree(vol);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStorageVolFree(vol);
@@ -3489,7 +3573,7 @@ static int
static int
remoteDispatchStorageVolGetInfo (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_vol_get_info_args *args,
remote_storage_vol_get_info_ret *ret)
{
@@ -3499,12 +3583,13 @@ remoteDispatchStorageVolGetInfo (struct
vol = get_nonnull_storage_vol (client->conn, args->vol);
if (vol == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_vol not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
if (virStorageVolGetInfo (vol, &info) == -1) {
virStorageVolFree(vol);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
@@ -3520,7 +3605,7 @@ static int
static int
remoteDispatchStorageVolDumpXml (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_vol_dump_xml_args *args,
remote_storage_vol_dump_xml_ret *ret)
{
@@ -3529,14 +3614,15 @@ remoteDispatchStorageVolDumpXml (struct
vol = get_nonnull_storage_vol (client->conn, args->vol);
if (vol == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_vol not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
/* remoteDispatchClientRequest will free this. */
ret->xml = virStorageVolGetXMLDesc (vol, args->flags);
if (!ret->xml) {
virStorageVolFree(vol);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStorageVolFree(vol);
@@ -3547,7 +3633,7 @@ static int
static int
remoteDispatchStorageVolGetPath (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_vol_get_path_args *args,
remote_storage_vol_get_path_ret *ret)
{
@@ -3556,14 +3642,15 @@ remoteDispatchStorageVolGetPath (struct
vol = get_nonnull_storage_vol (client->conn, args->vol);
if (vol == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_vol not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
/* remoteDispatchClientRequest will free this. */
ret->name = virStorageVolGetPath (vol);
if (!ret->name) {
virStorageVolFree(vol);
+ remoteDispatchConnError(rerr, client->conn);
return -1;
}
virStorageVolFree(vol);
@@ -3574,7 +3661,7 @@ static int
static int
remoteDispatchStorageVolLookupByName (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_vol_lookup_by_name_args *args,
remote_storage_vol_lookup_by_name_ret *ret)
{
@@ -3584,13 +3671,16 @@ remoteDispatchStorageVolLookupByName (st
pool = get_nonnull_storage_pool (client->conn, args->pool);
if (pool == NULL) {
- remoteDispatchError (client, req, "%s", _("storage_pool not found"));
- return -2;
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
}
vol = virStorageVolLookupByName (pool, args->name);
virStoragePoolFree(pool);
- if (vol == NULL) return -1;
+ if (vol == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_storage_vol (&ret->vol, vol);
virStorageVolFree(vol);
@@ -3600,7 +3690,7 @@ static int
static int
remoteDispatchStorageVolLookupByKey (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_vol_lookup_by_key_args *args,
remote_storage_vol_lookup_by_key_ret *ret)
{
@@ -3608,7 +3698,10 @@ remoteDispatchStorageVolLookupByKey (str
CHECK_CONN(client);
vol = virStorageVolLookupByKey (client->conn, args->key);
- if (vol == NULL) return -1;
+ if (vol == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_storage_vol (&ret->vol, vol);
virStorageVolFree(vol);
@@ -3619,7 +3712,7 @@ static int
static int
remoteDispatchStorageVolLookupByPath (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client,
- remote_message_header *req,
+ remote_error *rerr,
remote_storage_vol_lookup_by_path_args *args,
remote_storage_vol_lookup_by_path_ret *ret)
{
@@ -3627,7 +3720,10 @@ remoteDispatchStorageVolLookupByPath (st
CHECK_CONN(client);
vol = virStorageVolLookupByPath (client->conn, args->path);
- if (vol == NULL) return -1;
+ if (vol == NULL) {
+ remoteDispatchConnError(rerr, client->conn);
+ return -1;
+ }
make_nonnull_storage_vol (&ret->vol, vol);
virStorageVolFree(vol);
diff --git a/qemud/remote_dispatch_prototypes.h b/qemud/remote_dispatch_prototypes.h
--- a/qemud/remote_dispatch_prototypes.h
+++ b/qemud/remote_dispatch_prototypes.h
@@ -2,107 +2,107 @@
* Do not edit this file. Any changes you make will be lost.
*/
-static int remoteDispatchAuthList (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_auth_list_ret *ret);
-static int remoteDispatchAuthPolkit (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_auth_polkit_ret *ret);
-static int remoteDispatchAuthSaslInit (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_auth_sasl_init_ret *ret);
-static int remoteDispatchAuthSaslStart (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_auth_sasl_start_args *args, remote_auth_sasl_start_ret *ret);
-static int remoteDispatchAuthSaslStep (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_auth_sasl_step_args *args, remote_auth_sasl_step_ret *ret);
-static int remoteDispatchClose (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, void *ret);
-static int remoteDispatchDomainAttachDevice (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_attach_device_args *args, void *ret);
-static int remoteDispatchDomainBlockPeek (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_block_peek_args *args, remote_domain_block_peek_ret *ret);
-static int remoteDispatchDomainBlockStats (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_block_stats_args *args, remote_domain_block_stats_ret *ret);
-static int remoteDispatchDomainCoreDump (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_core_dump_args *args, void *ret);
-static int remoteDispatchDomainCreate (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_create_args *args, void *ret);
-static int remoteDispatchDomainCreateXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_create_xml_args *args, remote_domain_create_xml_ret *ret);
-static int remoteDispatchDomainDefineXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_define_xml_args *args, remote_domain_define_xml_ret *ret);
-static int remoteDispatchDomainDestroy (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_destroy_args *args, void *ret);
-static int remoteDispatchDomainDetachDevice (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_detach_device_args *args, void *ret);
-static int remoteDispatchDomainDumpXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_dump_xml_args *args, remote_domain_dump_xml_ret *ret);
-static int remoteDispatchDomainGetAutostart (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_get_autostart_args *args, remote_domain_get_autostart_ret *ret);
-static int remoteDispatchDomainGetInfo (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_get_info_args *args, remote_domain_get_info_ret *ret);
-static int remoteDispatchDomainGetMaxMemory (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_get_max_memory_args *args, remote_domain_get_max_memory_ret *ret);
-static int remoteDispatchDomainGetMaxVcpus (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_get_max_vcpus_args *args, remote_domain_get_max_vcpus_ret *ret);
-static int remoteDispatchDomainGetOsType (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_get_os_type_args *args, remote_domain_get_os_type_ret *ret);
-static int remoteDispatchDomainGetSchedulerParameters (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_get_scheduler_parameters_args *args, remote_domain_get_scheduler_parameters_ret *ret);
-static int remoteDispatchDomainGetSchedulerType (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_get_scheduler_type_args *args, remote_domain_get_scheduler_type_ret *ret);
-static int remoteDispatchDomainGetVcpus (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_get_vcpus_args *args, remote_domain_get_vcpus_ret *ret);
-static int remoteDispatchDomainInterfaceStats (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_interface_stats_args *args, remote_domain_interface_stats_ret *ret);
-static int remoteDispatchDomainLookupById (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_lookup_by_id_args *args, remote_domain_lookup_by_id_ret *ret);
-static int remoteDispatchDomainLookupByName (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_lookup_by_name_args *args, remote_domain_lookup_by_name_ret *ret);
-static int remoteDispatchDomainLookupByUuid (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_lookup_by_uuid_args *args, remote_domain_lookup_by_uuid_ret *ret);
-static int remoteDispatchDomainMemoryPeek (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_memory_peek_args *args, remote_domain_memory_peek_ret *ret);
-static int remoteDispatchDomainMigrateFinish (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_migrate_finish_args *args, remote_domain_migrate_finish_ret *ret);
-static int remoteDispatchDomainMigratePerform (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_migrate_perform_args *args, void *ret);
-static int remoteDispatchDomainMigratePrepare (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_migrate_prepare_args *args, remote_domain_migrate_prepare_ret *ret);
-static int remoteDispatchDomainPinVcpu (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_pin_vcpu_args *args, void *ret);
-static int remoteDispatchDomainReboot (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_reboot_args *args, void *ret);
-static int remoteDispatchDomainRestore (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_restore_args *args, void *ret);
-static int remoteDispatchDomainResume (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_resume_args *args, void *ret);
-static int remoteDispatchDomainSave (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_save_args *args, void *ret);
-static int remoteDispatchDomainSetAutostart (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_set_autostart_args *args, void *ret);
-static int remoteDispatchDomainSetMaxMemory (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_set_max_memory_args *args, void *ret);
-static int remoteDispatchDomainSetMemory (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_set_memory_args *args, void *ret);
-static int remoteDispatchDomainSetSchedulerParameters (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_set_scheduler_parameters_args *args, void *ret);
-static int remoteDispatchDomainSetVcpus (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_set_vcpus_args *args, void *ret);
-static int remoteDispatchDomainShutdown (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_shutdown_args *args, void *ret);
-static int remoteDispatchDomainSuspend (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_suspend_args *args, void *ret);
-static int remoteDispatchDomainUndefine (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_domain_undefine_args *args, void *ret);
-static int remoteDispatchFindStoragePoolSources (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_find_storage_pool_sources_args *args, remote_find_storage_pool_sources_ret *ret);
-static int remoteDispatchGetCapabilities (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_get_capabilities_ret *ret);
-static int remoteDispatchGetHostname (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_get_hostname_ret *ret);
-static int remoteDispatchGetMaxVcpus (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_get_max_vcpus_args *args, remote_get_max_vcpus_ret *ret);
-static int remoteDispatchGetType (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_get_type_ret *ret);
-static int remoteDispatchGetVersion (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_get_version_ret *ret);
-static int remoteDispatchListDefinedDomains (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_list_defined_domains_args *args, remote_list_defined_domains_ret *ret);
-static int remoteDispatchListDefinedNetworks (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_list_defined_networks_args *args, remote_list_defined_networks_ret *ret);
-static int remoteDispatchListDefinedStoragePools (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_list_defined_storage_pools_args *args, remote_list_defined_storage_pools_ret *ret);
-static int remoteDispatchListDomains (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_list_domains_args *args, remote_list_domains_ret *ret);
-static int remoteDispatchListNetworks (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_list_networks_args *args, remote_list_networks_ret *ret);
-static int remoteDispatchListStoragePools (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_list_storage_pools_args *args, remote_list_storage_pools_ret *ret);
-static int remoteDispatchNetworkCreate (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_create_args *args, void *ret);
-static int remoteDispatchNetworkCreateXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_create_xml_args *args, remote_network_create_xml_ret *ret);
-static int remoteDispatchNetworkDefineXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_define_xml_args *args, remote_network_define_xml_ret *ret);
-static int remoteDispatchNetworkDestroy (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_destroy_args *args, void *ret);
-static int remoteDispatchNetworkDumpXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_dump_xml_args *args, remote_network_dump_xml_ret *ret);
-static int remoteDispatchNetworkGetAutostart (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_get_autostart_args *args, remote_network_get_autostart_ret *ret);
-static int remoteDispatchNetworkGetBridgeName (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_get_bridge_name_args *args, remote_network_get_bridge_name_ret *ret);
-static int remoteDispatchNetworkLookupByName (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_lookup_by_name_args *args, remote_network_lookup_by_name_ret *ret);
-static int remoteDispatchNetworkLookupByUuid (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_lookup_by_uuid_args *args, remote_network_lookup_by_uuid_ret *ret);
-static int remoteDispatchNetworkSetAutostart (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_set_autostart_args *args, void *ret);
-static int remoteDispatchNetworkUndefine (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_undefine_args *args, void *ret);
-static int remoteDispatchNodeGetCellsFreeMemory (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_node_get_cells_free_memory_args *args, remote_node_get_cells_free_memory_ret *ret);
-static int remoteDispatchNodeGetFreeMemory (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_node_get_free_memory_ret *ret);
-static int remoteDispatchNodeGetInfo (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_node_get_info_ret *ret);
-static int remoteDispatchNumOfDefinedDomains (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_num_of_defined_domains_ret *ret);
-static int remoteDispatchNumOfDefinedNetworks (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_num_of_defined_networks_ret *ret);
-static int remoteDispatchNumOfDefinedStoragePools (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_num_of_defined_storage_pools_ret *ret);
-static int remoteDispatchNumOfDomains (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_num_of_domains_ret *ret);
-static int remoteDispatchNumOfNetworks (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_num_of_networks_ret *ret);
-static int remoteDispatchNumOfStoragePools (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_num_of_storage_pools_ret *ret);
-static int remoteDispatchOpen (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_open_args *args, void *ret);
-static int remoteDispatchStoragePoolBuild (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_build_args *args, void *ret);
-static int remoteDispatchStoragePoolCreate (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_create_args *args, void *ret);
-static int remoteDispatchStoragePoolCreateXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_create_xml_args *args, remote_storage_pool_create_xml_ret *ret);
-static int remoteDispatchStoragePoolDefineXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_define_xml_args *args, remote_storage_pool_define_xml_ret *ret);
-static int remoteDispatchStoragePoolDelete (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_delete_args *args, void *ret);
-static int remoteDispatchStoragePoolDestroy (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_destroy_args *args, void *ret);
-static int remoteDispatchStoragePoolDumpXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_dump_xml_args *args, remote_storage_pool_dump_xml_ret *ret);
-static int remoteDispatchStoragePoolGetAutostart (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_get_autostart_args *args, remote_storage_pool_get_autostart_ret *ret);
-static int remoteDispatchStoragePoolGetInfo (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_get_info_args *args, remote_storage_pool_get_info_ret *ret);
-static int remoteDispatchStoragePoolListVolumes (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_list_volumes_args *args, remote_storage_pool_list_volumes_ret *ret);
-static int remoteDispatchStoragePoolLookupByName (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_lookup_by_name_args *args, remote_storage_pool_lookup_by_name_ret *ret);
-static int remoteDispatchStoragePoolLookupByUuid (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_lookup_by_uuid_args *args, remote_storage_pool_lookup_by_uuid_ret *ret);
-static int remoteDispatchStoragePoolLookupByVolume (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_lookup_by_volume_args *args, remote_storage_pool_lookup_by_volume_ret *ret);
-static int remoteDispatchStoragePoolNumOfVolumes (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_num_of_volumes_args *args, remote_storage_pool_num_of_volumes_ret *ret);
-static int remoteDispatchStoragePoolRefresh (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_refresh_args *args, void *ret);
-static int remoteDispatchStoragePoolSetAutostart (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_set_autostart_args *args, void *ret);
-static int remoteDispatchStoragePoolUndefine (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_pool_undefine_args *args, void *ret);
-static int remoteDispatchStorageVolCreateXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_vol_create_xml_args *args, remote_storage_vol_create_xml_ret *ret);
-static int remoteDispatchStorageVolDelete (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_vol_delete_args *args, void *ret);
-static int remoteDispatchStorageVolDumpXml (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_vol_dump_xml_args *args, remote_storage_vol_dump_xml_ret *ret);
-static int remoteDispatchStorageVolGetInfo (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_vol_get_info_args *args, remote_storage_vol_get_info_ret *ret);
-static int remoteDispatchStorageVolGetPath (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_vol_get_path_args *args, remote_storage_vol_get_path_ret *ret);
-static int remoteDispatchStorageVolLookupByKey (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_vol_lookup_by_key_args *args, remote_storage_vol_lookup_by_key_ret *ret);
-static int remoteDispatchStorageVolLookupByName (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_vol_lookup_by_name_args *args, remote_storage_vol_lookup_by_name_ret *ret);
-static int remoteDispatchStorageVolLookupByPath (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_storage_vol_lookup_by_path_args *args, remote_storage_vol_lookup_by_path_ret *ret);
-static int remoteDispatchSupportsFeature (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_supports_feature_args *args, remote_supports_feature_ret *ret);
+static int remoteDispatchAuthList (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_auth_list_ret *ret);
+static int remoteDispatchAuthPolkit (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_auth_polkit_ret *ret);
+static int remoteDispatchAuthSaslInit (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_auth_sasl_init_ret *ret);
+static int remoteDispatchAuthSaslStart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_auth_sasl_start_args *args, remote_auth_sasl_start_ret *ret);
+static int remoteDispatchAuthSaslStep (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_auth_sasl_step_args *args, remote_auth_sasl_step_ret *ret);
+static int remoteDispatchClose (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, void *ret);
+static int remoteDispatchDomainAttachDevice (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_attach_device_args *args, void *ret);
+static int remoteDispatchDomainBlockPeek (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_block_peek_args *args, remote_domain_block_peek_ret *ret);
+static int remoteDispatchDomainBlockStats (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_block_stats_args *args, remote_domain_block_stats_ret *ret);
+static int remoteDispatchDomainCoreDump (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_core_dump_args *args, void *ret);
+static int remoteDispatchDomainCreate (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_create_args *args, void *ret);
+static int remoteDispatchDomainCreateXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_create_xml_args *args, remote_domain_create_xml_ret *ret);
+static int remoteDispatchDomainDefineXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_define_xml_args *args, remote_domain_define_xml_ret *ret);
+static int remoteDispatchDomainDestroy (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_destroy_args *args, void *ret);
+static int remoteDispatchDomainDetachDevice (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_detach_device_args *args, void *ret);
+static int remoteDispatchDomainDumpXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_dump_xml_args *args, remote_domain_dump_xml_ret *ret);
+static int remoteDispatchDomainGetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_autostart_args *args, remote_domain_get_autostart_ret *ret);
+static int remoteDispatchDomainGetInfo (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_info_args *args, remote_domain_get_info_ret *ret);
+static int remoteDispatchDomainGetMaxMemory (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_max_memory_args *args, remote_domain_get_max_memory_ret *ret);
+static int remoteDispatchDomainGetMaxVcpus (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_max_vcpus_args *args, remote_domain_get_max_vcpus_ret *ret);
+static int remoteDispatchDomainGetOsType (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_os_type_args *args, remote_domain_get_os_type_ret *ret);
+static int remoteDispatchDomainGetSchedulerParameters (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_scheduler_parameters_args *args, remote_domain_get_scheduler_parameters_ret *ret);
+static int remoteDispatchDomainGetSchedulerType (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_scheduler_type_args *args, remote_domain_get_scheduler_type_ret *ret);
+static int remoteDispatchDomainGetVcpus (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_get_vcpus_args *args, remote_domain_get_vcpus_ret *ret);
+static int remoteDispatchDomainInterfaceStats (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_interface_stats_args *args, remote_domain_interface_stats_ret *ret);
+static int remoteDispatchDomainLookupById (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_lookup_by_id_args *args, remote_domain_lookup_by_id_ret *ret);
+static int remoteDispatchDomainLookupByName (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_lookup_by_name_args *args, remote_domain_lookup_by_name_ret *ret);
+static int remoteDispatchDomainLookupByUuid (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_lookup_by_uuid_args *args, remote_domain_lookup_by_uuid_ret *ret);
+static int remoteDispatchDomainMemoryPeek (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_memory_peek_args *args, remote_domain_memory_peek_ret *ret);
+static int remoteDispatchDomainMigrateFinish (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_migrate_finish_args *args, remote_domain_migrate_finish_ret *ret);
+static int remoteDispatchDomainMigratePerform (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_migrate_perform_args *args, void *ret);
+static int remoteDispatchDomainMigratePrepare (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_migrate_prepare_args *args, remote_domain_migrate_prepare_ret *ret);
+static int remoteDispatchDomainPinVcpu (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_pin_vcpu_args *args, void *ret);
+static int remoteDispatchDomainReboot (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_reboot_args *args, void *ret);
+static int remoteDispatchDomainRestore (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_restore_args *args, void *ret);
+static int remoteDispatchDomainResume (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_resume_args *args, void *ret);
+static int remoteDispatchDomainSave (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_save_args *args, void *ret);
+static int remoteDispatchDomainSetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_set_autostart_args *args, void *ret);
+static int remoteDispatchDomainSetMaxMemory (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_set_max_memory_args *args, void *ret);
+static int remoteDispatchDomainSetMemory (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_set_memory_args *args, void *ret);
+static int remoteDispatchDomainSetSchedulerParameters (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_set_scheduler_parameters_args *args, void *ret);
+static int remoteDispatchDomainSetVcpus (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_set_vcpus_args *args, void *ret);
+static int remoteDispatchDomainShutdown (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_shutdown_args *args, void *ret);
+static int remoteDispatchDomainSuspend (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_suspend_args *args, void *ret);
+static int remoteDispatchDomainUndefine (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_domain_undefine_args *args, void *ret);
+static int remoteDispatchFindStoragePoolSources (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_find_storage_pool_sources_args *args, remote_find_storage_pool_sources_ret *ret);
+static int remoteDispatchGetCapabilities (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_get_capabilities_ret *ret);
+static int remoteDispatchGetHostname (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_get_hostname_ret *ret);
+static int remoteDispatchGetMaxVcpus (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_get_max_vcpus_args *args, remote_get_max_vcpus_ret *ret);
+static int remoteDispatchGetType (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_get_type_ret *ret);
+static int remoteDispatchGetVersion (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_get_version_ret *ret);
+static int remoteDispatchListDefinedDomains (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_defined_domains_args *args, remote_list_defined_domains_ret *ret);
+static int remoteDispatchListDefinedNetworks (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_defined_networks_args *args, remote_list_defined_networks_ret *ret);
+static int remoteDispatchListDefinedStoragePools (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_defined_storage_pools_args *args, remote_list_defined_storage_pools_ret *ret);
+static int remoteDispatchListDomains (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_domains_args *args, remote_list_domains_ret *ret);
+static int remoteDispatchListNetworks (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_networks_args *args, remote_list_networks_ret *ret);
+static int remoteDispatchListStoragePools (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_list_storage_pools_args *args, remote_list_storage_pools_ret *ret);
+static int remoteDispatchNetworkCreate (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_create_args *args, void *ret);
+static int remoteDispatchNetworkCreateXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_create_xml_args *args, remote_network_create_xml_ret *ret);
+static int remoteDispatchNetworkDefineXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_define_xml_args *args, remote_network_define_xml_ret *ret);
+static int remoteDispatchNetworkDestroy (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_destroy_args *args, void *ret);
+static int remoteDispatchNetworkDumpXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_dump_xml_args *args, remote_network_dump_xml_ret *ret);
+static int remoteDispatchNetworkGetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_get_autostart_args *args, remote_network_get_autostart_ret *ret);
+static int remoteDispatchNetworkGetBridgeName (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_get_bridge_name_args *args, remote_network_get_bridge_name_ret *ret);
+static int remoteDispatchNetworkLookupByName (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_lookup_by_name_args *args, remote_network_lookup_by_name_ret *ret);
+static int remoteDispatchNetworkLookupByUuid (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_lookup_by_uuid_args *args, remote_network_lookup_by_uuid_ret *ret);
+static int remoteDispatchNetworkSetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_set_autostart_args *args, void *ret);
+static int remoteDispatchNetworkUndefine (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_network_undefine_args *args, void *ret);
+static int remoteDispatchNodeGetCellsFreeMemory (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_node_get_cells_free_memory_args *args, remote_node_get_cells_free_memory_ret *ret);
+static int remoteDispatchNodeGetFreeMemory (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_node_get_free_memory_ret *ret);
+static int remoteDispatchNodeGetInfo (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_node_get_info_ret *ret);
+static int remoteDispatchNumOfDefinedDomains (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_defined_domains_ret *ret);
+static int remoteDispatchNumOfDefinedNetworks (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_defined_networks_ret *ret);
+static int remoteDispatchNumOfDefinedStoragePools (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_defined_storage_pools_ret *ret);
+static int remoteDispatchNumOfDomains (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_domains_ret *ret);
+static int remoteDispatchNumOfNetworks (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_networks_ret *ret);
+static int remoteDispatchNumOfStoragePools (struct qemud_server *server, struct qemud_client *client, remote_error *err, void *args, remote_num_of_storage_pools_ret *ret);
+static int remoteDispatchOpen (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_open_args *args, void *ret);
+static int remoteDispatchStoragePoolBuild (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_build_args *args, void *ret);
+static int remoteDispatchStoragePoolCreate (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_create_args *args, void *ret);
+static int remoteDispatchStoragePoolCreateXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_create_xml_args *args, remote_storage_pool_create_xml_ret *ret);
+static int remoteDispatchStoragePoolDefineXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_define_xml_args *args, remote_storage_pool_define_xml_ret *ret);
+static int remoteDispatchStoragePoolDelete (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_delete_args *args, void *ret);
+static int remoteDispatchStoragePoolDestroy (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_destroy_args *args, void *ret);
+static int remoteDispatchStoragePoolDumpXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_dump_xml_args *args, remote_storage_pool_dump_xml_ret *ret);
+static int remoteDispatchStoragePoolGetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_get_autostart_args *args, remote_storage_pool_get_autostart_ret *ret);
+static int remoteDispatchStoragePoolGetInfo (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_get_info_args *args, remote_storage_pool_get_info_ret *ret);
+static int remoteDispatchStoragePoolListVolumes (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_list_volumes_args *args, remote_storage_pool_list_volumes_ret *ret);
+static int remoteDispatchStoragePoolLookupByName (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_lookup_by_name_args *args, remote_storage_pool_lookup_by_name_ret *ret);
+static int remoteDispatchStoragePoolLookupByUuid (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_lookup_by_uuid_args *args, remote_storage_pool_lookup_by_uuid_ret *ret);
+static int remoteDispatchStoragePoolLookupByVolume (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_lookup_by_volume_args *args, remote_storage_pool_lookup_by_volume_ret *ret);
+static int remoteDispatchStoragePoolNumOfVolumes (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_num_of_volumes_args *args, remote_storage_pool_num_of_volumes_ret *ret);
+static int remoteDispatchStoragePoolRefresh (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_refresh_args *args, void *ret);
+static int remoteDispatchStoragePoolSetAutostart (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_set_autostart_args *args, void *ret);
+static int remoteDispatchStoragePoolUndefine (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_pool_undefine_args *args, void *ret);
+static int remoteDispatchStorageVolCreateXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_create_xml_args *args, remote_storage_vol_create_xml_ret *ret);
+static int remoteDispatchStorageVolDelete (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_delete_args *args, void *ret);
+static int remoteDispatchStorageVolDumpXml (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_dump_xml_args *args, remote_storage_vol_dump_xml_ret *ret);
+static int remoteDispatchStorageVolGetInfo (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_get_info_args *args, remote_storage_vol_get_info_ret *ret);
+static int remoteDispatchStorageVolGetPath (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_get_path_args *args, remote_storage_vol_get_path_ret *ret);
+static int remoteDispatchStorageVolLookupByKey (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_lookup_by_key_args *args, remote_storage_vol_lookup_by_key_ret *ret);
+static int remoteDispatchStorageVolLookupByName (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_lookup_by_name_args *args, remote_storage_vol_lookup_by_name_ret *ret);
+static int remoteDispatchStorageVolLookupByPath (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_storage_vol_lookup_by_path_args *args, remote_storage_vol_lookup_by_path_ret *ret);
+static int remoteDispatchSupportsFeature (struct qemud_server *server, struct qemud_client *client, remote_error *err, remote_supports_feature_args *args, remote_supports_feature_ret *ret);
diff --git a/qemud/remote_generate_stubs.pl b/qemud/remote_generate_stubs.pl
--- a/qemud/remote_generate_stubs.pl
+++ b/qemud/remote_generate_stubs.pl
@@ -100,7 +100,7 @@ elsif ($opt_p) {
elsif ($opt_p) {
my @keys = sort (keys %calls);
foreach (@keys) {
- print "static int remoteDispatch$calls{$_}->{ProcName} (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, $calls{$_}->{args} *args, $calls{$_}->{ret} *ret);\n";
+ print "static int remoteDispatch$calls{$_}->{ProcName} (struct qemud_server *server, struct qemud_client *client, remote_error *err, $calls{$_}->{args} *args, $calls{$_}->{ret} *ret);\n";
}
}
diff --git a/src/domain_conf.c b/src/domain_conf.c
--- a/src/domain_conf.c
+++ b/src/domain_conf.c
@@ -482,8 +482,12 @@ void virDomainRemoveInactive(virDomainOb
memmove(doms->objs + i, doms->objs + i + 1,
sizeof(*(doms->objs)) * (doms->count - (i + 1)));
- if (VIR_REALLOC_N(doms->objs, doms->count - 1) < 0) {
- ; /* Failure to reduce memory allocation isn't fatal */
+ if (doms->count > 1) {
+ if (VIR_REALLOC_N(doms->objs, doms->count - 1) < 0) {
+ ; /* Failure to reduce memory allocation isn't fatal */
+ }
+ } else {
+ VIR_FREE(doms->objs);
}
doms->count--;
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
2
1
Hi
I trying to create an application to manage virtual
machines using libvirt library.
Currently i am focusing with KVM hypervisor and bridge networking.
I face two issues which i cant find a solution....
First issue:
When i tried to reboot a virtual machine (using virDomain's reboot fn).
I got exception message that there was no support in the hypervisor
for reboot. is it true that we cant reboot a KVM based VM?
Second issue:
When i tried to setup a bridge network for KVM based VM.
I got error message like this ..
"QEMU quit during console startup
bind() failed"
I have listed below my steps which i tried setup bridge network.
On Dom0
===========
<<<<
brctl addbr br0
ifconfig eth0 0.0.0.0
brctl addif br0 eth0
ifconfig br0 192.168.1.82 netmask 255.255.255.0 up
route add -net 192.168.1.0 netmask 255.255.255.0 br0
route add default gw 192.168.1.1 br0
<<<<
** dom0 IP 192.168.1.82
after that i checked the network connection of the Dom0.. it was fine.
ifconfig was fine.
then i created tun/tap device like given in the following link
http://wiki.centos.org/HowTos/KVM#head-c02a0b33e7949b0bc3b151ac6e0bdfb91b6b…
<<<<<
sudo tunctl -b -u john
sudo ifconfig tap1 up
sudo brctl addif br0 tap1
export SDL_VIDEO_X11_DGAMOUSE=0
sudo iptables -I INPUT -i br0 -j ACCEPT
<<<<<
then i started to define vm like this...
<domain type="kvm">
<name>test82</name>
<uuid>e5520db4-ad8a-38c3-b9d9-4e3c7a1052dc</uuid>
<memory>131072</memory>
<vcpu>1</vcpu>
<on_poweroff>destroy</on_poweroff>
<os><type arch="i686">hvm</type>
<boot dev="hd"/>
</os>
<clock sync="localtime"/>
<features>
<pae/>
<acpi/>
<apic/>
</features>
<devices>
<emulator>/usr/bin/qemu-kvm</emulator>
<disk type="file" device="disk">
<source file="/dev/FluidVM_grp/Windows_NT_2003_121560222596"/>
<target dev="hda"/>
</disk>
<interface type="bridge">
<source bridge="br0"/>
</interface>
<interface type="bridge">
<source bridge="br0"/>
<target dev="tap1"/>
<mac address="00:16:3e:8f:ca:4b" />
</interface>
<graphics type="vnc" port="5900" listen="0.0.0.0"/>
</devices>
</domain>
is anything i am missing in setting up the bridge network?
Thanks and Regards,
-- Shan
1
0
Trying to connect to remote host via ssh. keys work fine but get this
--
*Trace - *
Unable to open connection to hypervisor URI
'xen+ssh://root@remote.boxdomain.com/':
<class 'libvirt.libvirtError'> virConnectOpenAuth() failed socket closed
unexpectedly
Traceback (most recent call last):
File "/usr/share/virt-manager/virtManager/connection.py", line 430, in
_open_thread
None], flags)
File "/usr/lib/python2.5/site-packages/libvirt.py", line 98, in openAuth
if ret is None:raise libvirtError('virConnectOpenAuth() failed')
libvirtError: virConnectOpenAuth() failed socket closed unexpectedly
*Remote Log - *
Oct 19 20:12:09 zeus sshd[1332]: Accepted publickey for root from
x.x.x.x port 52555 ssh2
Oct 19 20:12:10 zeus sshd[1336]: pam_unix(sshd:session): session opened
for user root by (uid=0)
not sure where to go - any way to enable verbose/debug logging?
deface
2
1
[libvirt] [PATCH] ALL_LINGUAS: remove "no", now that it's superseded by np.po
by Jim Meyering 20 Oct '08
by Jim Meyering 20 Oct '08
20 Oct '08
Without the first change below, "make distcheck" would fail due to the
absence of po/no.po. But that file was deliberately removed, because
np.po supersedes it.
I've just committed this first change.
[however, see below it]
>From 0ebd43afa961b6a1b0d5676920c2109d8adae56c Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Sun, 19 Oct 2008 11:34:22 +0200
Subject: [PATCH] ALL_LINGUAS: remove "no", now that it's superseded by np.po
* configure.in: Remove "no" from hard-coded list.
---
ChangeLog | 5 +++++
configure.in | 2 +-
2 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 6b056d6..cf455ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-10-19 Jim Meyering <meyering(a)redhat.com>
+
+ ALL_LINGUAS: remove "no", now that it's superseded by np.po
+ * configure.in: Remove "no" from hard-coded list.
+
Fri Oct 17 14:30:48 CEST 2008 Daniel Veillard <veillard(a)redhat.com>
* src/qemu_driver.c: add scsi/virtio hotplug support for KVM
diff --git a/configure.in b/configure.in
index 9be3fec..54f1fe1 100644
--- a/configure.in
+++ b/configure.in
@@ -1015,7 +1015,7 @@ if test -d po
then
ALL_LINGUAS=`(cd po > /dev/null && ls *.po) | sed 's+\.po$++'`
else
- ALL_LINGUAS="af am ar as be bg bn_IN bn ca cs cy da de el en_GB es et eu_ES fa fi fr gl gu he hi hr hu hy id is it ja ka kn ko ku lo lt lv mk ml mr ms my nb nl nn no nso or pa pl pt_BR pt ro ru si sk sl sq sr@latin sr sv ta te th tr uk ur vi zh_CN zh_TW zu"
+ ALL_LINGUAS="af am ar as be bg bn_IN bn ca cs cy da de el en_GB es et eu_ES fa fi fr gl gu he hi hr hu hy id is it ja ka kn ko ku lo lt lv mk ml mr ms my nb nl nn nso or pa pl pt_BR pt ro ru si sk sl sq sr@latin sr sv ta te th tr uk ur vi zh_CN zh_TW zu"
fi
dnl Extra link-time flags for Cygwin.
--
1.6.0.2.554.g3041b
============================================================================
However, there is no need to maintain that hard-coded list of .po files.
Here's a proposed patch to do away with it:
diff --git a/configure.in b/configure.in
index 54f1fe1..32fffb2 100644
--- a/configure.in
+++ b/configure.in
@@ -1011,12 +1011,7 @@ AM_CONDITIONAL([WITH_LIBVIRTD],[test "x$with_libvirtd" = "xyes"])
dnl Check for gettext
AM_GNU_GETTEXT_VERSION([0.14.1])
AM_GNU_GETTEXT([external])
-if test -d po
-then
- ALL_LINGUAS=`(cd po > /dev/null && ls *.po) | sed 's+\.po$++'`
-else
- ALL_LINGUAS="af am ar as be bg bn_IN bn ca cs cy da de el en_GB es et eu_ES fa fi fr gl gu he hi hr hu hy id is it ja ka kn ko ku lo lt lv mk ml mr ms my nb nl nn nso or pa pl pt_BR pt ro ru si sk sl sq sr@latin sr sv ta te th tr uk ur vi zh_CN zh_TW zu"
-fi
+ALL_LINGUAS=`(cd "$srcdir/po" > /dev/null && ls *.po) | sed 's+\.po$++'`
dnl Extra link-time flags for Cygwin.
dnl Copied from libxml2 configure.in, but I removed mingw changes
2
1
I'm trying to get NAT networking working with libvirt/virtual-manager and
KVM on Mandriva Linux.
I installed dnsmasq (and disabled the init script, as libvirt starts up
dnsmasq manually), bridge-utils, and added MII_NOT_SUPPORTED=yes to /etc/
sysconfig/ifcfg-virbr0, otherwise Mandriva's network scripts would
immediately try to get an IP on virbr0 with DHCP, removing the correct IP
address set by libvirt on its activation.
So currently I have:
# virsh net-list --all
Name State Autostart
-----------------------------------------
default active yes
# brctl show
bridge name bridge id STP enabled interfaces
pan0 8000.000000000000 no
virbr0 8000.000000000000 yes
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:21:70:AC:B0:8A
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Memory:f6ae0000-f6b00000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:9664 errors:0 dropped:0 overruns:0 frame:0
TX packets:9664 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:45094959 (43.0 MiB) TX bytes:45094959 (43.0 MiB)
virbr0 Link encap:Ethernet HWaddr EE:F4:3D:09:50:15
inet addr:192.168.122.1 Bcast:192.168.122.255
Mask:255.255.255.0
inet6 addr: fe80::ecf4:3dff:fe09:5015/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:52 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:11785 (11.5 KiB)
wlan0 Link encap:Ethernet HWaddr 00:16:EA:4C:A9:38
inet addr:192.168.100.24 Bcast:192.168.100.255
Mask:255.255.255.0
inet6 addr: fe80::216:eaff:fe4c:a938/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1496 errors:0 dropped:0 overruns:0 frame:0
TX packets:899 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:464043 (453.1 KiB) TX bytes:157558 (153.8 KiB)
wmaster0 Link encap:UNSPEC HWaddr 00-16-EA-4C-A9-38-20-
B4-00-00-00-00-00-00-00-00
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp
dpt:domain
ACCEPT tcp -- anywhere anywhere tcp
dpt:domain
ACCEPT udp -- anywhere anywhere udp
dpt:bootps
ACCEPT tcp -- anywhere anywhere tcp
dpt:bootps
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 192.168.122.0/24 state
RELATED,ESTABLISHED
ACCEPT all -- 192.168.122.0/24 anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with
icmp-port-unreachable
REJECT all -- anywhere anywhere reject-with
icmp-port-unreachable
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# ps aux | grep dnsmasq
nobody 2892 0.0 0.0 12388 920 ? S 22:26 0:00 dnsmasq
--keep-in-foreground --strict-order --bind-interfaces --pid-file --conf-
file --listen-address 192.168.122.1 --except-interface lo --dhcp-
leasefile=/var/lib/libvirt/dhcp-default.leases --dhcp-range
192.168.122.2,192.168.122.254
However, I still fail to get an IP address in my virtual machine.
In the logs, I cannot find anything problematic at first sight, libvirtd
when ran with the verbose option, continuously gives this:
Oct 19 22:45:02 defected libvirtd: EVENT: Poll got 1 event
Oct 19 22:45:02 defected libvirtd: EVENT: Dispatch 10 1 0x633040
Oct 19 22:45:02 defected libvirtd: EVENT: Remove handle 10
Oct 19 22:45:02 defected libvirtd: EVENT: mark delete 5
Oct 19 22:45:02 defected libvirtd: EVENT: Add handle 10 25 0x406e40
0x633040
Oct 19 22:45:02 defected libvirtd: EVENT: Remove handle 10
Oct 19 22:45:02 defected libvirtd: EVENT: mark delete 6
Oct 19 22:45:02 defected libvirtd: EVENT: Add handle 10 28 0x406e40
0x633040
Oct 19 22:45:02 defected libvirtd: EVENT: Calculate expiry of 0 timers
Oct 19 22:45:02 defected libvirtd: EVENT: Timeout at 0 due in -1 ms
Oct 19 22:45:02 defected libvirtd: EVENT: Poll on 6 handles 0x6574c0
timeout -1
Oct 19 22:45:02 defected libvirtd: EVENT: Poll got 1 event
Oct 19 22:45:02 defected libvirtd: EVENT: Dispatch 10 4 0x633040
Oct 19 22:45:02 defected libvirtd: EVENT: Remove handle 10
Oct 19 22:45:02 defected libvirtd: EVENT: mark delete 5
Oct 19 22:45:02 defected libvirtd: EVENT: Add handle 10 25 0x406e40
0x633040
Oct 19 22:45:02 defected libvirtd: EVENT: Calculate expiry of 0 timers
Oct 19 22:45:02 defected libvirtd: EVENT: Timeout at 0 due in -1 ms
Oct 19 22:45:02 defected libvirtd: EVENT: Poll on 6 handles 0x6574c0
timeout -1
Oct 19 22:45:02 defected libvirtd: EVENT: Poll got 1 event
Any idea what is wrong or what I should check to debug this further?
--
Frederik Himpe
1
0