/* Internal data to be passed to SAX parser and used by error handler. */
struct virParserData {
int domcode;
+ const char *filename;
};
catchXMLError(void *ctx, const char *msg G_GNUC_UNUSED, ...)
{
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
-
+ struct virParserData *private = ctxt->_private;
const xmlChar *cur, *base;
unsigned int n, col; /* GCC warns if signed, because compared with sizeof() */
int domcode = VIR_FROM_XML;
g_autofree char *contextstr = NULL;
g_autofree char *pointerstr = NULL;
const xmlError *lastError = xmlCtxtGetLastError(ctxt);
+ const char *filename = NULL;
+
+ if (private)
+ filename = private->filename;
/* conditions for error printing */
if (!ctxt ||
lastError->message == NULL)
return;
- if (ctxt->_private)
- domcode = ((struct virParserData *) ctxt->_private)->domcode;
-
+ if (private)
+ domcode = private->domcode;
cur = ctxt->input->cur;
base = ctxt->input->base;
pointerstr = virBufferContentAndReset(&buf);
- if (lastError->file) {
+ if (filename) {
virGenericReportError(domcode, VIR_ERR_XML_DETAIL,
_("%1$s:%2$d: %3$s%4$s\n%5$s"),
- lastError->file,
+ filename,
lastError->line,
lastError->message,
contextstr,
abort();
private.domcode = domcode;
+ private.filename = filename;
pctxt->_private = &private;
pctxt->sax->error = catchXMLError;