[libvirt] [PATCH] Detailed XML errors when XML is not well-formed
Daniel Veillard
veillard at redhat.com
Wed Jul 30 15:34:26 UTC 2008
On Wed, Jul 30, 2008 at 03:57:57PM +0100, Daniel P. Berrange wrote:
> On Wed, Jul 30, 2008 at 03:49:17PM +0100, Richard W.M. Jones wrote:
> > This patch changes the implementations lots of functions which parse
> > XML documents, so that if the XML document is not well-formed then we
> > get detailed error messages.
> >
> > The general form of the change is:
> >
> > static void
> > catchXMLError (void *ctx, const char *msg ATTRIBUTE_UNUSED, ...)
> > {
> > // a callback which calls virDomainReportError
> > }
> >
> > virDomainDefPtr virDomainDefParseString(virConnectPtr conn,
> > virCapsPtr caps,
> > const char *xmlStr)
> > {
> > xmlParserCtxtPtr pctxt;
> >
> > pctxt = xmlNewParserCtxt ();
> > pctxt->sax->error = catchXMLError;
> >
> > xml = xmlCtxtReadDoc (pctxt, //...) etc.
> >
> > There are some unavoidable shortcomings:
> >
> > (1) There is no place to stash user pointers during the callback (the
> > suggestively named pctxt->userData field is already used for something
> > else), so we cannot pass the virConnectPtr to the error function. As
> > a result, virterror will store the error in a global variable, and
> > callers will probably not be able to access it.
void *_private; /* For user data, libxml won't touch it */
just set _private in the parser context, you should get the parser context
back in the SAX handler, then you can get to your _private data. that
should work and avoid the mess of global variables and thread stuff...
> > (2) The XML parser routinely produces multiple error messages, and
> > virterror throws away all but the last one.
>
> It'd probably be more use to only report the first one, since the latter
> problems may well be caused by earlier problems.
Likely but not always correct, maybe the solution is to build a big
string concatenating all the errors and passing it back
> You won't see those except with the 'test' or 'xen' drivers run
> locally. Anything going via the daemon will be output on the
> daemon's stderr (/dev/null) and not on the client.
yeah, unfortunately we have to assume a model where each errors can't
be reported individually,
Daniel
--
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard | virtualization library http://libvirt.org/
veillard at redhat.com | libxml GNOME XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/
More information about the libvir-list
mailing list