void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level level, int code, const char *fmt, va_list args) { int saved_errno = errno; char msgbuf[XC_MAX_ERROR_MSG_LEN]; char *msg; /* Strip newlines from messages. * XXX really the messages themselves should have the newlines removed. */ char fmt_nonewline[512]; int fmt_l; fmt_l = strlen(fmt); if (fmt_l && fmt[fmt_l-1]=='\n' && fmt_l < sizeof(fmt_nonewline)) { memcpy(fmt_nonewline, fmt, fmt_l-1); fmt_nonewline[fmt_l-1] = 0; fmt = fmt_nonewline; } if ( level >= XTL_ERROR ) { msg = xch->last_error.message; xch->last_error.code = code; } else { msg = msgbuf; } vsnprintf(msg, XC_MAX_ERROR_MSG_LEN-1, fmt, args); msg[XC_MAX_ERROR_MSG_LEN-1] = '\0'; xtl_log(lg, level, -1, "xc", "%s" "%s%s", msg, code?": ":"", code ? xc_error_code_to_desc(code) : ""); errno = saved_errno; }
static void failwith_xc(xc_interface *xch) { static char error_str[ERROR_STRLEN]; if (xch) { const xc_error *error = xc_get_last_error(xch); if (error->code == XC_ERROR_NONE) snprintf(error_str, ERROR_STRLEN, "%d: %s", errno, strerror(errno)); else snprintf(error_str, ERROR_STRLEN, "%d: %s: %s", error->code, xc_error_code_to_desc(error->code), error->message); } else { snprintf(error_str, ERROR_STRLEN, "Unable to open XC interface"); } caml_raise_with_string(*caml_named_value("xc.error"), error_str); }
void xc_default_error_handler(const xc_error *err) { const char *desc = xc_error_code_to_desc(err->code); fprintf(stderr, "ERROR %s: %s\n", desc, err->message); }