[libvirt] [PATCH] Detailed XML errors using the _private field

Here is a patch which uses the _private field to store the virConnectPtr. Rich. -- Richard Jones, Emerging Technologies, Red Hat http://et.redhat.com/~rjones virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into Xen guests. http://et.redhat.com/~rjones/virt-p2v

On Wed, Jul 30, 2008 at 05:23:50PM +0100, Richard W.M. Jones wrote:
Here is a patch which uses the _private field to store the virConnectPtr.
This looks nicer than the pthread approach. I'd still like to see it report the first error, instead of last though.
Index: src/domain_conf.c =================================================================== RCS file: /data/cvs/libvirt/src/domain_conf.c,v retrieving revision 1.10 diff -u -r1.10 domain_conf.c --- src/domain_conf.c 28 Jul 2008 14:06:54 -0000 1.10 +++ src/domain_conf.c 30 Jul 2008 16:21:54 -0000 @@ -1838,32 +1838,57 @@ return NULL; }
+/* Called from SAX on parsing errors in the XML. */ +static void +catchXMLError (void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + + if (ctxt && + ctxt->lastError.level == XML_ERR_FATAL && + ctxt->lastError.message != NULL) {
eg to add in if (ctx->lastError.code == VIR_ERR_NONE)
+ virDomainReportError (ctxt->_private, VIR_ERR_XML_DETAIL, + ctxt->lastError.message, ctxt->lastError.line); + } +}
virDomainDefPtr virDomainDefParseString(virConnectPtr conn, virCapsPtr caps, const char *xmlStr) { - xmlDocPtr xml; + xmlParserCtxtPtr pctxt; + xmlDocPtr xml = NULL; xmlNodePtr root; virDomainDefPtr def = NULL;
- if (!(xml = xmlReadDoc(BAD_CAST xmlStr, "domain.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOERROR | XML_PARSE_NOWARNING))) { - virDomainReportError(conn, VIR_ERR_XML_ERROR, NULL); - return NULL; + /* Set up a parser context so we can catch the details of XML errors. */ + pctxt = xmlNewParserCtxt (); + if (!pctxt || !pctxt->sax) + goto cleanup; + pctxt->sax->error = catchXMLError; + pctxt->_private = conn; +
And have virResetError(&conn->err);
+ xml = xmlCtxtReadDoc (pctxt, BAD_CAST xmlStr, "domain.xml", NULL, + XML_PARSE_NOENT | XML_PARSE_NONET | + XML_PARSE_NOWARNING); + if (!xml) { + /* virDomainReportError has already been called by the + * callback function (hopefully). + */
Should set a generic error if no specific one is set.. if (conn->err.code == VIR_ERR_NONE) virDomainReportError(conn, VIR_ERR_XML_ERR, _("failed to parse xml doc")
+ goto cleanup; }
[snip] And same for other 3 parsers. 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 :|
participants (2)
-
Daniel P. Berrange
-
Richard W.M. Jones