提交 d4a9a0d6 编写于 作者: M Mark McLoughlin

Tue Feb 14 16:14:32 IST 2007 Mark McLoughlin <markmc@redhat.com>

        * src/xend_internal.c, src/xm_internal.c: pass the
        connection to virDomainParseXMLDesc()

        * src/xml.[ch]: make virDomainParseXMLDesc accept
        a virConnectPtr so that we can use it later to
        lookup the bridge associated with a network

        * tests/xml2sexprtest.c: just pass NULL here, it's
        safe
上级 0c15bd8b
Tue Feb 14 16:14:32 IST 2007 Mark McLoughlin <markmc@redhat.com>
* src/xend_internal.c, src/xm_internal.c: pass the
connection to virDomainParseXMLDesc()
* src/xml.[ch]: make virDomainParseXMLDesc accept
a virConnectPtr so that we can use it later to
lookup the bridge associated with a network
* tests/xml2sexprtest.c: just pass NULL here, it's
safe
Tue Feb 14 16:08:55 IST 2007 Mark McLoughlin <markmc@redhat.com> Tue Feb 14 16:08:55 IST 2007 Mark McLoughlin <markmc@redhat.com>
* qemud/conf.c: add support for connecting a qemu * qemud/conf.c: add support for connecting a qemu
......
...@@ -2828,7 +2828,7 @@ xenDaemonCreateLinux(virConnectPtr conn, const char *xmlDesc, ...@@ -2828,7 +2828,7 @@ xenDaemonCreateLinux(virConnectPtr conn, const char *xmlDesc,
return (NULL); return (NULL);
} }
sexpr = virDomainParseXMLDesc(xmlDesc, &name, conn->xendConfigVersion); sexpr = virDomainParseXMLDesc(conn, xmlDesc, &name, conn->xendConfigVersion);
if ((sexpr == NULL) || (name == NULL)) { if ((sexpr == NULL) || (name == NULL)) {
virXendError(conn, VIR_ERR_XML_ERROR, "domain"); virXendError(conn, VIR_ERR_XML_ERROR, "domain");
if (sexpr != NULL) if (sexpr != NULL)
...@@ -2897,7 +2897,7 @@ xenDaemonAttachDevice(virDomainPtr domain, char *xml) ...@@ -2897,7 +2897,7 @@ xenDaemonAttachDevice(virDomainPtr domain, char *xml)
if (strcmp(virDomainGetOSType(domain), "linux")) if (strcmp(virDomainGetOSType(domain), "linux"))
hvm = 1; hvm = 1;
sexpr = virParseXMLDevice(xml, hvm, domain->conn->xendConfigVersion); sexpr = virParseXMLDevice(domain->conn, xml, hvm, domain->conn->xendConfigVersion);
if (sexpr == NULL) if (sexpr == NULL)
return (-1); return (-1);
if (!memcmp(sexpr, "(device ", 8)) { if (!memcmp(sexpr, "(device ", 8)) {
...@@ -2954,7 +2954,7 @@ virDomainPtr xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc) { ...@@ -2954,7 +2954,7 @@ virDomainPtr xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc) {
if (conn->xendConfigVersion < 3) if (conn->xendConfigVersion < 3)
return(NULL); return(NULL);
sexpr = virDomainParseXMLDesc(xmlDesc, &name, conn->xendConfigVersion); sexpr = virDomainParseXMLDesc(conn, xmlDesc, &name, conn->xendConfigVersion);
if ((sexpr == NULL) || (name == NULL)) { if ((sexpr == NULL) || (name == NULL)) {
virXendError(conn, VIR_ERR_XML_ERROR, "domain"); virXendError(conn, VIR_ERR_XML_ERROR, "domain");
if (sexpr != NULL) if (sexpr != NULL)
......
...@@ -1287,7 +1287,7 @@ int xenXMDomainCreate(virDomainPtr domain) { ...@@ -1287,7 +1287,7 @@ int xenXMDomainCreate(virDomainPtr domain) {
if (!(xml = xenXMDomainDumpXML(domain, 0))) if (!(xml = xenXMDomainDumpXML(domain, 0)))
return (-1); return (-1);
if (!(sexpr = virDomainParseXMLDesc(xml, NULL, domain->conn->xendConfigVersion))) { if (!(sexpr = virDomainParseXMLDesc(domain->conn, xml, NULL, domain->conn->xendConfigVersion))) {
free(xml); free(xml);
return (-1); return (-1);
} }
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#include "xs_internal.h" /* for xenStoreDomainGetNetworkID */ #include "xs_internal.h" /* for xenStoreDomainGetNetworkID */
static void static void
virXMLError(virErrorNumber error, const char *info, int value) virXMLError(virConnectPtr conn, virErrorNumber error, const char *info, int value)
{ {
const char *errmsg; const char *errmsg;
...@@ -34,7 +34,7 @@ virXMLError(virErrorNumber error, const char *info, int value) ...@@ -34,7 +34,7 @@ virXMLError(virErrorNumber error, const char *info, int value)
return; return;
errmsg = __virErrorMsg(error, info); errmsg = __virErrorMsg(error, info);
__virRaiseError(NULL, NULL, NULL, VIR_FROM_XML, error, VIR_ERR_ERROR, __virRaiseError(conn, NULL, NULL, VIR_FROM_XML, error, VIR_ERR_ERROR,
errmsg, info, NULL, value, 0, errmsg, info, value); errmsg, info, NULL, value, 0, errmsg, info, value);
} }
...@@ -62,7 +62,7 @@ virBufferGrow(virBufferPtr buf, unsigned int len) ...@@ -62,7 +62,7 @@ virBufferGrow(virBufferPtr buf, unsigned int len)
newbuf = (char *) realloc(buf->content, size); newbuf = (char *) realloc(buf->content, size);
if (newbuf == NULL) { if (newbuf == NULL) {
virXMLError(VIR_ERR_NO_MEMORY, _("growing buffer"), size); virXMLError(NULL, VIR_ERR_NO_MEMORY, _("growing buffer"), size);
return (-1); return (-1);
} }
buf->content = newbuf; buf->content = newbuf;
...@@ -114,11 +114,11 @@ virBufferNew(unsigned int size) ...@@ -114,11 +114,11 @@ virBufferNew(unsigned int size)
virBufferPtr buf; virBufferPtr buf;
if (!(buf = malloc(sizeof(*buf)))) { if (!(buf = malloc(sizeof(*buf)))) {
virXMLError(VIR_ERR_NO_MEMORY, _("allocate new buffer"), sizeof(*buf)); virXMLError(NULL, VIR_ERR_NO_MEMORY, _("allocate new buffer"), sizeof(*buf));
return NULL; return NULL;
} }
if (size && (buf->content = malloc(size))==NULL) { if (size && (buf->content = malloc(size))==NULL) {
virXMLError(VIR_ERR_NO_MEMORY, _("allocate buffer content"), size); virXMLError(NULL, VIR_ERR_NO_MEMORY, _("allocate buffer content"), size);
free(buf); free(buf);
return NULL; return NULL;
} }
...@@ -213,6 +213,7 @@ virBufferStrcat(virBufferPtr buf, ...) ...@@ -213,6 +213,7 @@ virBufferStrcat(virBufferPtr buf, ...)
#ifndef PROXY #ifndef PROXY
/** /**
* virtDomainParseXMLGraphicsDescImage: * virtDomainParseXMLGraphicsDescImage:
* @conn: pointer to the hypervisor connection
* @node: node containing graphics description * @node: node containing graphics description
* @buf: a buffer for the result S-Expr * @buf: a buffer for the result S-Expr
* @xendConfigVersion: xend configuration file format * @xendConfigVersion: xend configuration file format
...@@ -224,7 +225,7 @@ virBufferStrcat(virBufferPtr buf, ...) ...@@ -224,7 +225,7 @@ virBufferStrcat(virBufferPtr buf, ...)
* *
* Returns 0 in case of success, -1 in case of error * Returns 0 in case of success, -1 in case of error
*/ */
static int virDomainParseXMLGraphicsDescImage(xmlNodePtr node, virBufferPtr buf, int xendConfigVersion) static int virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, virBufferPtr buf, int xendConfigVersion)
{ {
xmlChar *graphics_type = NULL; xmlChar *graphics_type = NULL;
...@@ -271,6 +272,7 @@ static int virDomainParseXMLGraphicsDescImage(xmlNodePtr node, virBufferPtr buf, ...@@ -271,6 +272,7 @@ static int virDomainParseXMLGraphicsDescImage(xmlNodePtr node, virBufferPtr buf,
/** /**
* virtDomainParseXMLGraphicsDescVFB: * virtDomainParseXMLGraphicsDescVFB:
* @conn: pointer to the hypervisor connection
* @node: node containing graphics description * @node: node containing graphics description
* @buf: a buffer for the result S-Expr * @buf: a buffer for the result S-Expr
* *
...@@ -281,7 +283,7 @@ static int virDomainParseXMLGraphicsDescImage(xmlNodePtr node, virBufferPtr buf, ...@@ -281,7 +283,7 @@ static int virDomainParseXMLGraphicsDescImage(xmlNodePtr node, virBufferPtr buf,
* *
* Returns 0 in case of success, -1 in case of error * Returns 0 in case of success, -1 in case of error
*/ */
static int virDomainParseXMLGraphicsDescVFB(xmlNodePtr node, virBufferPtr buf) static int virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, virBufferPtr buf)
{ {
xmlChar *graphics_type = NULL; xmlChar *graphics_type = NULL;
...@@ -329,6 +331,7 @@ static int virDomainParseXMLGraphicsDescVFB(xmlNodePtr node, virBufferPtr buf) ...@@ -329,6 +331,7 @@ static int virDomainParseXMLGraphicsDescVFB(xmlNodePtr node, virBufferPtr buf)
/** /**
* virDomainParseXMLOSDescHVM: * virDomainParseXMLOSDescHVM:
* @conn: pointer to the hypervisor connection
* @node: node containing HVM OS description * @node: node containing HVM OS description
* @buf: a buffer for the result S-Expr * @buf: a buffer for the result S-Expr
* @ctxt: a path context representing the XML description * @ctxt: a path context representing the XML description
...@@ -343,7 +346,7 @@ static int virDomainParseXMLGraphicsDescVFB(xmlNodePtr node, virBufferPtr buf) ...@@ -343,7 +346,7 @@ static int virDomainParseXMLGraphicsDescVFB(xmlNodePtr node, virBufferPtr buf)
* Returns 0 in case of success, -1 in case of error. * Returns 0 in case of success, -1 in case of error.
*/ */
static int static int
virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ctxt, int vcpus, int xendConfigVersion) virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ctxt, int vcpus, int xendConfigVersion)
{ {
xmlXPathObjectPtr obj = NULL; xmlXPathObjectPtr obj = NULL;
xmlNodePtr cur, txt; xmlNodePtr cur, txt;
...@@ -376,12 +379,12 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ...@@ -376,12 +379,12 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
} }
if ((type == NULL) || (!xmlStrEqual(type, BAD_CAST "hvm"))) { if ((type == NULL) || (!xmlStrEqual(type, BAD_CAST "hvm"))) {
/* VIR_ERR_OS_TYPE */ /* VIR_ERR_OS_TYPE */
virXMLError(VIR_ERR_OS_TYPE, (const char *) type, 0); virXMLError(conn, VIR_ERR_OS_TYPE, (const char *) type, 0);
return (-1); return (-1);
} }
virBufferAdd(buf, "(image (hvm ", 12); virBufferAdd(buf, "(image (hvm ", 12);
if (loader == NULL) { if (loader == NULL) {
virXMLError(VIR_ERR_NO_KERNEL, NULL, 0); virXMLError(conn, VIR_ERR_NO_KERNEL, NULL, 0);
goto error; goto error;
} else { } else {
virBufferVSprintf(buf, "(kernel '%s')", (const char *) loader); virBufferVSprintf(buf, "(kernel '%s')", (const char *) loader);
...@@ -391,7 +394,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ...@@ -391,7 +394,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
obj = xmlXPathEval(BAD_CAST "string(/domain/devices/emulator[1])", ctxt); obj = xmlXPathEval(BAD_CAST "string(/domain/devices/emulator[1])", ctxt);
if ((obj == NULL) || (obj->type != XPATH_STRING) || if ((obj == NULL) || (obj->type != XPATH_STRING) ||
(obj->stringval == NULL) || (obj->stringval[0] == 0)) { (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
virXMLError(VIR_ERR_NO_KERNEL, NULL, 0); /* TODO: error */ virXMLError(conn, VIR_ERR_NO_KERNEL, NULL, 0); /* TODO: error */
goto error; goto error;
} }
virBufferVSprintf(buf, "(device_model '%s')", virBufferVSprintf(buf, "(device_model '%s')",
...@@ -410,7 +413,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ...@@ -410,7 +413,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
virBufferVSprintf(buf, "(boot c)", (const char *) boot_dev); virBufferVSprintf(buf, "(boot c)", (const char *) boot_dev);
} else { } else {
/* Any other type of boot dev is unsupported right now */ /* Any other type of boot dev is unsupported right now */
virXMLError(VIR_ERR_XML_ERROR, NULL, 0); virXMLError(conn, VIR_ERR_XML_ERROR, NULL, 0);
} }
/* get the 1st floppy device file */ /* get the 1st floppy device file */
...@@ -491,7 +494,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ...@@ -491,7 +494,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
obj = xmlXPathEval(BAD_CAST "count(domain/devices/console) > 0", ctxt); obj = xmlXPathEval(BAD_CAST "count(domain/devices/console) > 0", ctxt);
if ((obj == NULL) || (obj->type != XPATH_BOOLEAN)) { if ((obj == NULL) || (obj->type != XPATH_BOOLEAN)) {
virXMLError(VIR_ERR_XML_ERROR, NULL, 0); virXMLError(conn, VIR_ERR_XML_ERROR, NULL, 0);
goto error; goto error;
} }
if (obj->boolval) { if (obj->boolval) {
...@@ -504,7 +507,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ...@@ -504,7 +507,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt); obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt);
if ((obj != NULL) && (obj->type == XPATH_NODESET) && if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) { (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) {
res = virDomainParseXMLGraphicsDescImage(obj->nodesetval->nodeTab[0], buf, xendConfigVersion); res = virDomainParseXMLGraphicsDescImage(conn, obj->nodesetval->nodeTab[0], buf, xendConfigVersion);
if (res != 0) { if (res != 0) {
goto error; goto error;
} }
...@@ -527,6 +530,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ...@@ -527,6 +530,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
/** /**
* virDomainParseXMLOSDescPV: * virDomainParseXMLOSDescPV:
* @conn: pointer to the hypervisor connection
* @node: node containing PV OS description * @node: node containing PV OS description
* @buf: a buffer for the result S-Expr * @buf: a buffer for the result S-Expr
* @ctxt: a path context representing the XML description * @ctxt: a path context representing the XML description
...@@ -540,7 +544,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ...@@ -540,7 +544,7 @@ virDomainParseXMLOSDescHVM(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
* Returns 0 in case of success, -1 in case of error. * Returns 0 in case of success, -1 in case of error.
*/ */
static int static int
virDomainParseXMLOSDescPV(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ctxt, int xendConfigVersion) virDomainParseXMLOSDescPV(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ctxt, int xendConfigVersion)
{ {
xmlNodePtr cur, txt; xmlNodePtr cur, txt;
xmlXPathObjectPtr obj = NULL; xmlXPathObjectPtr obj = NULL;
...@@ -590,12 +594,12 @@ virDomainParseXMLOSDescPV(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ...@@ -590,12 +594,12 @@ virDomainParseXMLOSDescPV(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
} }
if ((type != NULL) && (!xmlStrEqual(type, BAD_CAST "linux"))) { if ((type != NULL) && (!xmlStrEqual(type, BAD_CAST "linux"))) {
/* VIR_ERR_OS_TYPE */ /* VIR_ERR_OS_TYPE */
virXMLError(VIR_ERR_OS_TYPE, (const char *) type, 0); virXMLError(conn, VIR_ERR_OS_TYPE, (const char *) type, 0);
return (-1); return (-1);
} }
virBufferAdd(buf, "(image (linux ", 14); virBufferAdd(buf, "(image (linux ", 14);
if (kernel == NULL) { if (kernel == NULL) {
virXMLError(VIR_ERR_NO_KERNEL, NULL, 0); virXMLError(conn, VIR_ERR_NO_KERNEL, NULL, 0);
return (-1); return (-1);
} else { } else {
virBufferVSprintf(buf, "(kernel '%s')", (const char *) kernel); virBufferVSprintf(buf, "(kernel '%s')", (const char *) kernel);
...@@ -613,7 +617,7 @@ virDomainParseXMLOSDescPV(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ...@@ -613,7 +617,7 @@ virDomainParseXMLOSDescPV(xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr
obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt); obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics[1]", ctxt);
if ((obj != NULL) && (obj->type == XPATH_NODESET) && if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) { (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) {
res = virDomainParseXMLGraphicsDescImage(obj->nodesetval->nodeTab[0], buf, xendConfigVersion); res = virDomainParseXMLGraphicsDescImage(conn, obj->nodesetval->nodeTab[0], buf, xendConfigVersion);
if (res != 0) { if (res != 0) {
goto error; goto error;
} }
...@@ -642,7 +646,7 @@ virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { ...@@ -642,7 +646,7 @@ virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
if ((ctxt != NULL) && if ((ctxt != NULL) &&
(ctxt->lastError.level == XML_ERR_FATAL) && (ctxt->lastError.level == XML_ERR_FATAL) &&
(ctxt->lastError.message != NULL)) { (ctxt->lastError.message != NULL)) {
virXMLError(VIR_ERR_XML_DETAIL, ctxt->lastError.message, virXMLError(NULL, VIR_ERR_XML_DETAIL, ctxt->lastError.message,
ctxt->lastError.line); ctxt->lastError.line);
} }
} }
...@@ -650,6 +654,7 @@ virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { ...@@ -650,6 +654,7 @@ virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
/** /**
* virDomainParseXMLDiskDesc: * virDomainParseXMLDiskDesc:
* @node: node containing disk description * @node: node containing disk description
* @conn: pointer to the hypervisor connection
* @buf: a buffer for the result S-Expr * @buf: a buffer for the result S-Expr
* @xendConfigVersion: xend configuration file format * @xendConfigVersion: xend configuration file format
* *
...@@ -661,7 +666,7 @@ virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { ...@@ -661,7 +666,7 @@ virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
* Returns 0 in case of success, -1 in case of error. * Returns 0 in case of success, -1 in case of error.
*/ */
static int static int
virDomainParseXMLDiskDesc(xmlNodePtr node, virBufferPtr buf, int hvm, int xendConfigVersion) virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf, int hvm, int xendConfigVersion)
{ {
xmlNodePtr cur; xmlNodePtr cur;
xmlChar *type = NULL; xmlChar *type = NULL;
...@@ -713,7 +718,7 @@ virDomainParseXMLDiskDesc(xmlNodePtr node, virBufferPtr buf, int hvm, int xendCo ...@@ -713,7 +718,7 @@ virDomainParseXMLDiskDesc(xmlNodePtr node, virBufferPtr buf, int hvm, int xendCo
} }
if (source == NULL) { if (source == NULL) {
virXMLError(VIR_ERR_NO_SOURCE, (const char *) target, 0); virXMLError(conn, VIR_ERR_NO_SOURCE, (const char *) target, 0);
if (target != NULL) if (target != NULL)
xmlFree(target); xmlFree(target);
...@@ -722,7 +727,7 @@ virDomainParseXMLDiskDesc(xmlNodePtr node, virBufferPtr buf, int hvm, int xendCo ...@@ -722,7 +727,7 @@ virDomainParseXMLDiskDesc(xmlNodePtr node, virBufferPtr buf, int hvm, int xendCo
return (-1); return (-1);
} }
if (target == NULL) { if (target == NULL) {
virXMLError(VIR_ERR_NO_TARGET, (const char *) source, 0); virXMLError(conn, VIR_ERR_NO_TARGET, (const char *) source, 0);
if (source != NULL) if (source != NULL)
xmlFree(source); xmlFree(source);
if (device != NULL) if (device != NULL)
...@@ -816,6 +821,7 @@ virDomainParseXMLDiskDesc(xmlNodePtr node, virBufferPtr buf, int hvm, int xendCo ...@@ -816,6 +821,7 @@ virDomainParseXMLDiskDesc(xmlNodePtr node, virBufferPtr buf, int hvm, int xendCo
/** /**
* virDomainParseXMLIfDesc: * virDomainParseXMLIfDesc:
* @conn: pointer to the hypervisor connection
* @node: node containing the interface description * @node: node containing the interface description
* @buf: a buffer for the result S-Expr * @buf: a buffer for the result S-Expr
* *
...@@ -827,7 +833,7 @@ virDomainParseXMLDiskDesc(xmlNodePtr node, virBufferPtr buf, int hvm, int xendCo ...@@ -827,7 +833,7 @@ virDomainParseXMLDiskDesc(xmlNodePtr node, virBufferPtr buf, int hvm, int xendCo
* Returns 0 in case of success, -1 in case of error. * Returns 0 in case of success, -1 in case of error.
*/ */
static int static int
virDomainParseXMLIfDesc(xmlNodePtr node, virBufferPtr buf, int hvm) virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, virBufferPtr buf, int hvm)
{ {
xmlNodePtr cur; xmlNodePtr cur;
xmlChar *type = NULL; xmlChar *type = NULL;
...@@ -902,6 +908,7 @@ virDomainParseXMLIfDesc(xmlNodePtr node, virBufferPtr buf, int hvm) ...@@ -902,6 +908,7 @@ virDomainParseXMLIfDesc(xmlNodePtr node, virBufferPtr buf, int hvm)
/** /**
* virDomainParseXMLDesc: * virDomainParseXMLDesc:
* @conn: pointer to the hypervisor connection
* @xmldesc: string with the XML description * @xmldesc: string with the XML description
* @xendConfigVersion: xend configuration file format * @xendConfigVersion: xend configuration file format
* *
...@@ -914,7 +921,7 @@ virDomainParseXMLIfDesc(xmlNodePtr node, virBufferPtr buf, int hvm) ...@@ -914,7 +921,7 @@ virDomainParseXMLIfDesc(xmlNodePtr node, virBufferPtr buf, int hvm)
* the caller must free() the returned value. * the caller must free() the returned value.
*/ */
char * char *
virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion) virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int xendConfigVersion)
{ {
xmlDocPtr xml = NULL; xmlDocPtr xml = NULL;
xmlNodePtr node; xmlNodePtr node;
...@@ -945,6 +952,9 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion) ...@@ -945,6 +952,9 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion)
goto error; goto error;
} }
/* TODO pass the connection point to the error handler:
* pctxt->userData = virConnectPtr;
*/
pctxt->sax->error = virCatchXMLParseError; pctxt->sax->error = virCatchXMLParseError;
xml = xmlCtxtReadDoc(pctxt, (const xmlChar *) xmldesc, "domain.xml", NULL, xml = xmlCtxtReadDoc(pctxt, (const xmlChar *) xmldesc, "domain.xml", NULL,
...@@ -976,13 +986,13 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion) ...@@ -976,13 +986,13 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion)
obj = xmlXPathEval(BAD_CAST "string(/domain/name[1])", ctxt); obj = xmlXPathEval(BAD_CAST "string(/domain/name[1])", ctxt);
if ((obj == NULL) || (obj->type != XPATH_STRING) || if ((obj == NULL) || (obj->type != XPATH_STRING) ||
(obj->stringval == NULL) || (obj->stringval[0] == 0)) { (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
virXMLError(VIR_ERR_NO_NAME, xmldesc, 0); virXMLError(conn, VIR_ERR_NO_NAME, xmldesc, 0);
goto error; goto error;
} }
virBufferVSprintf(&buf, "(name '%s')", obj->stringval); virBufferVSprintf(&buf, "(name '%s')", obj->stringval);
nam = strdup((const char *) obj->stringval); nam = strdup((const char *) obj->stringval);
if (nam == NULL) { if (nam == NULL) {
virXMLError(VIR_ERR_NO_MEMORY, "copying name", 0); virXMLError(conn, VIR_ERR_NO_MEMORY, "copying name", 0);
goto error; goto error;
} }
xmlXPathFreeObject(obj); xmlXPathFreeObject(obj);
...@@ -1069,17 +1079,17 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion) ...@@ -1069,17 +1079,17 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion)
((tmpobj->type != XPATH_STRING) || (tmpobj->stringval == NULL) ((tmpobj->type != XPATH_STRING) || (tmpobj->stringval == NULL)
|| (tmpobj->stringval[0] == 0))) { || (tmpobj->stringval[0] == 0))) {
xmlXPathFreeObject(tmpobj); xmlXPathFreeObject(tmpobj);
virXMLError(VIR_ERR_OS_TYPE, nam, 0); virXMLError(conn, VIR_ERR_OS_TYPE, nam, 0);
goto error; goto error;
} }
if ((tmpobj == NULL) if ((tmpobj == NULL)
|| !xmlStrEqual(tmpobj->stringval, BAD_CAST "hvm")) { || !xmlStrEqual(tmpobj->stringval, BAD_CAST "hvm")) {
res = virDomainParseXMLOSDescPV(obj->nodesetval->nodeTab[0], res = virDomainParseXMLOSDescPV(conn, obj->nodesetval->nodeTab[0],
&buf, ctxt, xendConfigVersion); &buf, ctxt, xendConfigVersion);
} else { } else {
hvm = 1; hvm = 1;
res = virDomainParseXMLOSDescHVM(obj->nodesetval->nodeTab[0], res = virDomainParseXMLOSDescHVM(conn, obj->nodesetval->nodeTab[0],
&buf, ctxt, vcpus, xendConfigVersion); &buf, ctxt, vcpus, xendConfigVersion);
} }
...@@ -1088,7 +1098,7 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion) ...@@ -1088,7 +1098,7 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion)
if (res != 0) if (res != 0)
goto error; goto error;
} else if (bootloader == 0) { } else if (bootloader == 0) {
virXMLError(VIR_ERR_NO_OS, nam, 0); virXMLError(conn, VIR_ERR_NO_OS, nam, 0);
goto error; goto error;
} }
xmlXPathFreeObject(obj); xmlXPathFreeObject(obj);
...@@ -1099,7 +1109,7 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion) ...@@ -1099,7 +1109,7 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion)
if ((obj != NULL) && (obj->type == XPATH_NODESET) && if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) { (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) {
for (i = 0; i < obj->nodesetval->nodeNr; i++) { for (i = 0; i < obj->nodesetval->nodeNr; i++) {
res = virDomainParseXMLDiskDesc(obj->nodesetval->nodeTab[i], &buf, hvm, xendConfigVersion); res = virDomainParseXMLDiskDesc(conn, obj->nodesetval->nodeTab[i], &buf, hvm, xendConfigVersion);
if (res != 0) { if (res != 0) {
goto error; goto error;
} }
...@@ -1112,7 +1122,7 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion) ...@@ -1112,7 +1122,7 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion)
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) { (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) {
for (i = 0; i < obj->nodesetval->nodeNr; i++) { for (i = 0; i < obj->nodesetval->nodeNr; i++) {
virBufferAdd(&buf, "(device ", 8); virBufferAdd(&buf, "(device ", 8);
res = virDomainParseXMLIfDesc(obj->nodesetval->nodeTab[i], &buf, hvm); res = virDomainParseXMLIfDesc(conn, obj->nodesetval->nodeTab[i], &buf, hvm);
if (res != 0) { if (res != 0) {
goto error; goto error;
} }
...@@ -1127,7 +1137,7 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion) ...@@ -1127,7 +1137,7 @@ virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion)
if ((obj != NULL) && (obj->type == XPATH_NODESET) && if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) { (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) {
for (i = 0; i < obj->nodesetval->nodeNr; i++) { for (i = 0; i < obj->nodesetval->nodeNr; i++) {
res = virDomainParseXMLGraphicsDescVFB(obj->nodesetval->nodeTab[i], &buf); res = virDomainParseXMLGraphicsDescVFB(conn, obj->nodesetval->nodeTab[i], &buf);
if (res != 0) { if (res != 0) {
goto error; goto error;
} }
...@@ -1232,6 +1242,7 @@ unsigned char *virParseUUID(char **ptr, const char *uuid) { ...@@ -1232,6 +1242,7 @@ unsigned char *virParseUUID(char **ptr, const char *uuid) {
#ifndef PROXY #ifndef PROXY
/** /**
* virParseXMLDevice: * virParseXMLDevice:
* @conn: pointer to the hypervisor connection
* @xmldesc: string with the XML description * @xmldesc: string with the XML description
* @hvm: 1 for fully virtualized guest, 0 for paravirtualized * @hvm: 1 for fully virtualized guest, 0 for paravirtualized
* @xendConfigVersion: xend configuration file format * @xendConfigVersion: xend configuration file format
...@@ -1245,7 +1256,7 @@ unsigned char *virParseUUID(char **ptr, const char *uuid) { ...@@ -1245,7 +1256,7 @@ unsigned char *virParseUUID(char **ptr, const char *uuid) {
* the caller must free() the returned value. * the caller must free() the returned value.
*/ */
char * char *
virParseXMLDevice(char *xmldesc, int hvm, int xendConfigVersion) virParseXMLDevice(virConnectPtr conn, char *xmldesc, int hvm, int xendConfigVersion)
{ {
xmlDocPtr xml = NULL; xmlDocPtr xml = NULL;
xmlNodePtr node; xmlNodePtr node;
...@@ -1265,11 +1276,11 @@ virParseXMLDevice(char *xmldesc, int hvm, int xendConfigVersion) ...@@ -1265,11 +1276,11 @@ virParseXMLDevice(char *xmldesc, int hvm, int xendConfigVersion)
if (node == NULL) if (node == NULL)
goto error; goto error;
if (xmlStrEqual(node->name, BAD_CAST "disk")) { if (xmlStrEqual(node->name, BAD_CAST "disk")) {
if (virDomainParseXMLDiskDesc(node, &buf, hvm, xendConfigVersion) != 0) if (virDomainParseXMLDiskDesc(conn, node, &buf, hvm, xendConfigVersion) != 0)
goto error; goto error;
} }
else if (xmlStrEqual(node->name, BAD_CAST "interface")) { else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
if (virDomainParseXMLIfDesc(node, &buf, hvm) != 0) if (virDomainParseXMLIfDesc(conn, node, &buf, hvm) != 0)
goto error; goto error;
} }
cleanup: cleanup:
......
...@@ -29,9 +29,9 @@ void virBufferFree(virBufferPtr buf); ...@@ -29,9 +29,9 @@ void virBufferFree(virBufferPtr buf);
int virBufferAdd(virBufferPtr buf, const char *str, int len); int virBufferAdd(virBufferPtr buf, const char *str, int len);
int virBufferVSprintf(virBufferPtr buf, const char *format, ...); int virBufferVSprintf(virBufferPtr buf, const char *format, ...);
int virBufferStrcat(virBufferPtr buf, ...); int virBufferStrcat(virBufferPtr buf, ...);
char *virDomainParseXMLDesc(const char *xmldesc, char **name, int xendConfigVersion); char *virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int xendConfigVersion);
unsigned char *virParseUUID(char **ptr, const char *uuid); unsigned char *virParseUUID(char **ptr, const char *uuid);
char *virParseXMLDevice(char *xmldesc, int hvm, int xendConfigVersion); char *virParseXMLDevice(virConnectPtr conn, char *xmldesc, int hvm, int xendConfigVersion);
int virDomainXMLDevID(virDomainPtr domain, char *xmldesc, char *class, char *ref); int virDomainXMLDevID(virDomainPtr domain, char *xmldesc, char *class, char *ref);
#ifdef __cplusplus #ifdef __cplusplus
......
...@@ -24,7 +24,7 @@ static int testCompareFiles(const char *xml, const char *sexpr, const char *name ...@@ -24,7 +24,7 @@ static int testCompareFiles(const char *xml, const char *sexpr, const char *name
if (virtTestLoadFile(sexpr, &sexprPtr, MAX_FILE) < 0) if (virtTestLoadFile(sexpr, &sexprPtr, MAX_FILE) < 0)
goto fail; goto fail;
if (!(gotsexpr = virDomainParseXMLDesc(xmlData, &gotname, xendConfigVersion))) if (!(gotsexpr = virDomainParseXMLDesc(NULL, xmlData, &gotname, xendConfigVersion)))
goto fail; goto fail;
if (getenv("DEBUG_TESTS")) { if (getenv("DEBUG_TESTS")) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册