Instead of just printing the libxml2 error string and line number, actually include the filename so the user knows where to look for the error! Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- osinfo/osinfo_loader.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c index 2dc29c4..a5e26ad 100644 --- a/osinfo/osinfo_loader.c +++ b/osinfo/osinfo_loader.c @@ -1610,18 +1610,25 @@ static void osinfo_loader_root(OsinfoLoader *loader, } } + +struct LibosinfoXMLData { + GError **err; + const gchar *file; +}; + static void catchXMLError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; if (ctxt && ctxt->_private) { - GError **err = ctxt->_private; - if (!error_is_set(err)) { - gchar *xmlmsg = g_strdup_printf("at line %d: %s", + struct LibosinfoXMLData *data = ctxt->_private; + if (!error_is_set(data->err)) { + gchar *xmlmsg = g_strdup_printf("Cannot parse %s at line %d: %s", + data->file, ctxt->lastError.line, ctxt->lastError.message); - OSINFO_ERROR(ctxt->_private, xmlmsg); + OSINFO_ERROR(data->err, xmlmsg); g_free(xmlmsg); } } @@ -1637,6 +1644,10 @@ static void osinfo_loader_process_xml(OsinfoLoader *loader, xmlXPathContextPtr ctxt = NULL; xmlDocPtr xml = NULL; xmlNodePtr root; + struct LibosinfoXMLData data = { + .err = err, + .file = src, + }; /* Set up a parser context so we can catch the details of XML errors. */ pctxt = xmlNewParserCtxt(); @@ -1645,7 +1656,7 @@ static void osinfo_loader_process_xml(OsinfoLoader *loader, goto cleanup; } - pctxt->_private = err; + pctxt->_private = &data; pctxt->sax->error = catchXMLError; xml = xmlCtxtReadDoc(pctxt, BAD_CAST xmlStr, src, NULL, -- 2.4.3 _______________________________________________ Libosinfo mailing list Libosinfo@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libosinfo