Fix error location logging

This commit is contained in:
Daniel P. Berrange 2009-05-27 12:10:47 +00:00
parent ad8a5e5daa
commit fb828ed21d
3 changed files with 72 additions and 40 deletions

View File

@ -1,3 +1,10 @@
Tue May 26 13:09:30 BST 2009 Daniel P. Berrange <berrange@redhat.com>
Fix error location logging
* src/virterror.c, src/virterror_internal.h: Re-factor error
reporting APIs to ensure correct source location info is
passed through to eventual virLogMessage call.
Tue May 26 11:25:30 BST 2009 Daniel P. Berrange <berrange@redhat.com> Tue May 26 11:25:30 BST 2009 Daniel P. Berrange <berrange@redhat.com>
* tests/Makefile.am: Add ocaml intermediate files to CLEANFILES * tests/Makefile.am: Add ocaml intermediate files to CLEANFILES

View File

@ -590,10 +590,11 @@ virSetConnError(virConnectPtr conn)
/** /**
* virRaiseError: * virRaiseErrorFull:
* @conn: the connection to the hypervisor if available * @conn: the connection to the hypervisor if available
* @dom: the domain if available * @filename: filename where error was raised
* @net: the network if available * @funcname: function name where error was raised
* @linenr: line number where error was raised
* @domain: the virErrorDomain indicating where it's coming from * @domain: the virErrorDomain indicating where it's coming from
* @code: the virErrorNumber code for the error * @code: the virErrorNumber code for the error
* @level: the virErrorLevel for the error * @level: the virErrorLevel for the error
@ -609,12 +610,19 @@ virSetConnError(virConnectPtr conn)
* immediately if a callback is found and store it for later handling. * immediately if a callback is found and store it for later handling.
*/ */
void void
virRaiseError(virConnectPtr conn, virRaiseErrorFull(virConnectPtr conn,
virDomainPtr dom ATTRIBUTE_UNUSED, const char *filename ATTRIBUTE_UNUSED,
virNetworkPtr net ATTRIBUTE_UNUSED, const char *funcname,
int domain, int code, virErrorLevel level, size_t linenr,
const char *str1, const char *str2, const char *str3, int domain,
int int1, int int2, const char *msg, ...) int code,
virErrorLevel level,
const char *str1,
const char *str2,
const char *str3,
int int1,
int int2,
const char *fmt, ...)
{ {
virErrorPtr to; virErrorPtr to;
void *userData = virUserData; void *userData = virUserData;
@ -650,18 +658,18 @@ virRaiseError(virConnectPtr conn,
/* /*
* formats the message * formats the message
*/ */
if (msg == NULL) { if (fmt == NULL) {
str = strdup(_("No error message provided")); str = strdup(_("No error message provided"));
} else { } else {
VIR_GET_VAR_STR(msg, str); VIR_GET_VAR_STR(fmt, str);
} }
/* /*
* Hook up the error or warning to the logging facility * Hook up the error or warning to the logging facility
* TODO: pass function name and lineno * XXXX should we include filename as 'category' instead of domain name ?
*/ */
virLogMessage(virErrorDomainName(domain), virErrorLevelPriority(level), virLogMessage(virErrorDomainName(domain), virErrorLevelPriority(level),
NULL, 0, 1, "%s", str); funcname, linenr, 1, "%s", str);
/* /*
* Save the information about the error * Save the information about the error
@ -1067,10 +1075,12 @@ virErrorMsg(virErrorNumber error, const char *info)
* Helper function to do most of the grunt work for individual driver * Helper function to do most of the grunt work for individual driver
* ReportError * ReportError
*/ */
void virReportErrorHelper(virConnectPtr conn, int domcode, int errcode, void virReportErrorHelper(virConnectPtr conn,
const char *filename ATTRIBUTE_UNUSED, int domcode,
const char *funcname ATTRIBUTE_UNUSED, int errcode,
size_t linenr ATTRIBUTE_UNUSED, const char *filename,
const char *funcname,
size_t linenr,
const char *fmt, ...) const char *fmt, ...)
{ {
va_list args; va_list args;
@ -1086,8 +1096,10 @@ void virReportErrorHelper(virConnectPtr conn, int domcode, int errcode,
} }
virerr = virErrorMsg(errcode, (errorMessage[0] ? errorMessage : NULL)); virerr = virErrorMsg(errcode, (errorMessage[0] ? errorMessage : NULL));
virRaiseError(conn, NULL, NULL, domcode, errcode, VIR_ERR_ERROR, virRaiseErrorFull(conn, filename, funcname, linenr,
virerr, errorMessage, NULL, -1, -1, virerr, errorMessage); domcode, errcode, VIR_ERR_ERROR,
virerr, errorMessage, NULL,
-1, -1, virerr, errorMessage);
} }
@ -1116,9 +1128,9 @@ const char *virStrerror(int theerrno, char *errBuf, size_t errBufLen)
void virReportSystemErrorFull(virConnectPtr conn, void virReportSystemErrorFull(virConnectPtr conn,
int domcode, int domcode,
int theerrno, int theerrno,
const char *filename ATTRIBUTE_UNUSED, const char *filename,
const char *funcname ATTRIBUTE_UNUSED, const char *funcname,
size_t linenr ATTRIBUTE_UNUSED, size_t linenr,
const char *fmt, ...) const char *fmt, ...)
{ {
char strerror_buf[1024]; char strerror_buf[1024];
@ -1148,19 +1160,21 @@ void virReportSystemErrorFull(virConnectPtr conn,
if (!msgDetail) if (!msgDetail)
msgDetail = errnoDetail; msgDetail = errnoDetail;
virRaiseError(conn, NULL, NULL, domcode, VIR_ERR_SYSTEM_ERROR, VIR_ERR_ERROR, virRaiseErrorFull(conn, filename, funcname, linenr,
msg, msgDetail, NULL, -1, -1, msg, msgDetail); domcode, VIR_ERR_SYSTEM_ERROR, VIR_ERR_ERROR,
msg, msgDetail, NULL, -1, -1, msg, msgDetail);
} }
void virReportOOMErrorFull(virConnectPtr conn, void virReportOOMErrorFull(virConnectPtr conn,
int domcode, int domcode,
const char *filename ATTRIBUTE_UNUSED, const char *filename,
const char *funcname ATTRIBUTE_UNUSED, const char *funcname,
size_t linenr ATTRIBUTE_UNUSED) size_t linenr)
{ {
const char *virerr; const char *virerr;
virerr = virErrorMsg(VIR_ERR_NO_MEMORY, NULL); virerr = virErrorMsg(VIR_ERR_NO_MEMORY, NULL);
virRaiseError(conn, NULL, NULL, domcode, VIR_ERR_NO_MEMORY, VIR_ERR_ERROR, virRaiseErrorFull(conn, filename, funcname, linenr,
virerr, NULL, NULL, -1, -1, virerr, NULL); domcode, VIR_ERR_NO_MEMORY, VIR_ERR_ERROR,
virerr, NULL, NULL, -1, -1, virerr, NULL);
} }

View File

@ -33,17 +33,28 @@ extern void *virUserData;
* * * *
************************************************************************/ ************************************************************************/
int virErrorInitialize(void); int virErrorInitialize(void);
void virRaiseError(virConnectPtr conn, void virRaiseErrorFull(virConnectPtr conn,
virDomainPtr dom, const char *filename,
virNetworkPtr net, const char *funcname,
int domain, size_t linenr,
int code, int domain,
virErrorLevel level, int code,
const char *str1, virErrorLevel level,
const char *str2, const char *str1,
const char *str3, const char *str2,
int int1, int int2, const char *msg, ...) const char *str3,
ATTRIBUTE_FORMAT(printf, 12, 13); int int1,
int int2,
const char *fmt, ...)
ATTRIBUTE_FORMAT(printf, 13, 14);
/* Includes 'dom' and 'net' for compatbility, but they're ignored */
#define virRaiseError(conn, dom, net, domain, code, level, \
str1, str2, str3, int1, int2, msg, ...) \
virRaiseErrorFull(conn, __FILE__, __FUNCTION__, __LINE__, \
domain, code, level, str1, str2, str3, int1, int2, \
msg, __VA_ARGS__)
const char *virErrorMsg(virErrorNumber error, const char *info); const char *virErrorMsg(virErrorNumber error, const char *info);
void virReportErrorHelper(virConnectPtr conn, int domcode, int errcode, void virReportErrorHelper(virConnectPtr conn, int domcode, int errcode,
const char *filename ATTRIBUTE_UNUSED, const char *filename ATTRIBUTE_UNUSED,