Add virNetwork support to virError in order that the network on which the error occurred can be reported. Note, the issue here is that virError is a public structure and we're arguably breaking ABI if we enlarge it. However, it's unlikely anyone would define a virError structure themself. Signed-off-by: Mark McLoughlin <markmc@xxxxxxxxxx> Index: libvirt/include/libvirt/virterror.h =================================================================== --- libvirt.orig/include/libvirt/virterror.h +++ libvirt/include/libvirt/virterror.h @@ -72,6 +72,7 @@ struct _virError { char *str3; /* extra string information */ int int1; /* extra number information */ int int2; /* extra number information */ + virNetworkPtr net; /* the network if available */ }; /** Index: libvirt/src/conf.c =================================================================== --- libvirt.orig/src/conf.c +++ libvirt/src/conf.c @@ -95,7 +95,7 @@ virConfError(virConfPtr conf ATTRIBUTE_U return; errmsg = __virErrorMsg(error, info); - __virRaiseError(NULL, NULL, VIR_FROM_CONF, error, VIR_ERR_ERROR, + __virRaiseError(NULL, NULL, NULL, VIR_FROM_CONF, error, VIR_ERR_ERROR, errmsg, info, NULL, line, 0, errmsg, info, line); } Index: libvirt/src/hash.c =================================================================== --- libvirt.orig/src/hash.c +++ libvirt/src/hash.c @@ -617,7 +617,7 @@ virHashError(virConnectPtr conn, virErro return; errmsg = __virErrorMsg(error, info); - __virRaiseError(conn, NULL, VIR_FROM_NONE, error, VIR_ERR_ERROR, + __virRaiseError(conn, NULL, NULL, VIR_FROM_NONE, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info); } Index: libvirt/src/internal.h =================================================================== --- libvirt.orig/src/internal.h +++ libvirt/src/internal.h @@ -200,6 +200,7 @@ char *virDomainGetVMInfo(virDomainPtr do ************************************************************************/ void __virRaiseError(virConnectPtr conn, virDomainPtr dom, + virNetworkPtr net, int domain, int code, virErrorLevel level, Index: libvirt/src/libvirt.c =================================================================== --- libvirt.orig/src/libvirt.c +++ libvirt/src/libvirt.c @@ -107,7 +107,7 @@ virLibConnError(virConnectPtr conn, virE return; errmsg = __virErrorMsg(error, info); - __virRaiseError(conn, NULL, VIR_FROM_NONE, error, VIR_ERR_ERROR, + __virRaiseError(conn, NULL, NULL, VIR_FROM_NONE, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info); } @@ -133,7 +133,7 @@ virLibDomainError(virDomainPtr domain, v if (error != VIR_ERR_INVALID_DOMAIN) { conn = domain->conn; } - __virRaiseError(conn, domain, VIR_FROM_DOM, error, VIR_ERR_ERROR, + __virRaiseError(conn, domain, NULL, VIR_FROM_DOM, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info); } @@ -159,8 +159,7 @@ virLibNetworkError(virNetworkPtr network if (error != VIR_ERR_INVALID_NETWORK) { conn = network->conn; } - /* XXX: should be able to pass network pointer here */ - __virRaiseError(conn, NULL, VIR_FROM_NET, error, VIR_ERR_ERROR, + __virRaiseError(conn, NULL, network, VIR_FROM_NET, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info); } Index: libvirt/src/proxy_internal.c =================================================================== --- libvirt.orig/src/proxy_internal.c +++ libvirt/src/proxy_internal.c @@ -116,7 +116,7 @@ virProxyError(virConnectPtr conn, virErr return; errmsg = __virErrorMsg(error, info); - __virRaiseError(conn, NULL, VIR_FROM_PROXY, error, VIR_ERR_ERROR, + __virRaiseError(conn, NULL, NULL, VIR_FROM_PROXY, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info); } Index: libvirt/src/qemu_internal.c =================================================================== --- libvirt.orig/src/qemu_internal.c +++ libvirt/src/qemu_internal.c @@ -140,7 +140,7 @@ qemuError(virConnectPtr con, return; errmsg = __virErrorMsg(error, info); - __virRaiseError(con, dom, VIR_FROM_QEMU, error, VIR_ERR_ERROR, + __virRaiseError(con, dom, NULL, VIR_FROM_QEMU, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info, 0); } Index: libvirt/src/sexpr.c =================================================================== --- libvirt.orig/src/sexpr.c +++ libvirt/src/sexpr.c @@ -38,7 +38,7 @@ virSexprError(virErrorNumber error, cons return; errmsg = __virErrorMsg(error, info); - __virRaiseError(NULL, NULL, VIR_FROM_SEXPR, error, VIR_ERR_ERROR, + __virRaiseError(NULL, NULL, NULL, VIR_FROM_SEXPR, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info); } Index: libvirt/src/test.c =================================================================== --- libvirt.orig/src/test.c +++ libvirt/src/test.c @@ -198,7 +198,7 @@ testError(virConnectPtr con, return; errmsg = __virErrorMsg(error, info); - __virRaiseError(con, dom, VIR_FROM_XEN, error, VIR_ERR_ERROR, + __virRaiseError(con, dom, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info, 0); } Index: libvirt/src/virterror.c =================================================================== --- libvirt.orig/src/virterror.c +++ libvirt/src/virterror.c @@ -17,7 +17,7 @@ #include "internal.h" static virError lastErr = /* the last error */ -{ 0, 0, NULL, VIR_ERR_NONE, NULL, NULL, NULL, NULL, NULL, 0, 0 }; +{ 0, 0, NULL, VIR_ERR_NONE, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL }; static virErrorFunc virErrorHandler = NULL; /* global error handlet */ static void *virUserData = NULL; /* associated data */ @@ -230,7 +230,7 @@ virConnSetErrorFunc(virConnectPtr conn, void virDefaultErrorFunc(virErrorPtr err) { - const char *lvl = "", *dom = "", *domain = ""; + const char *lvl = "", *dom = "", *domain = "", *network = ""; int len; if ((err == NULL) || (err->code == VIR_ERR_OK)) @@ -277,24 +277,27 @@ virDefaultErrorFunc(virErrorPtr err) } if ((err->dom != NULL) && (err->code != VIR_ERR_INVALID_DOMAIN)) { domain = err->dom->name; + } else if ((err->net != NULL) && (err->code != VIR_ERR_INVALID_NETWORK)) { + network = err->net->name; } len = strlen(err->message); if ((err->domain == VIR_FROM_XML) && (err->code == VIR_ERR_XML_DETAIL) && (err->int1 != 0)) - fprintf(stderr, "libvir: %s%s %s: line %d: %s", - dom, lvl, domain, err->int1, err->message); + fprintf(stderr, "libvir: %s%s %s%s: line %d: %s", + dom, lvl, domain, network, err->int1, err->message); else if ((len == 0) || (err->message[len - 1] != '\n')) - fprintf(stderr, "libvir: %s%s %s: %s\n", - dom, lvl, domain, err->message); + fprintf(stderr, "libvir: %s%s %s%s: %s\n", + dom, lvl, domain, network, err->message); else - fprintf(stderr, "libvir: %s%s %s: %s", - dom, lvl, domain, err->message); + fprintf(stderr, "libvir: %s%s %s%s: %s", + dom, lvl, domain, network, err->message); } /** * __virRaiseError: * @conn: the connection to the hypervisor if available * @dom: the domain if available + * @net: the network if available * @domain: the virErrorDomain indicating where it's coming from * @code: the virErrorNumber code for the error * @level: the virErrorLevel for the error @@ -310,7 +313,7 @@ virDefaultErrorFunc(virErrorPtr err) * immediately if a callback is found and store it for later handling. */ void -__virRaiseError(virConnectPtr conn, virDomainPtr dom, +__virRaiseError(virConnectPtr conn, virDomainPtr dom, virNetworkPtr net, int domain, int code, virErrorLevel level, const char *str1, const char *str2, const char *str3, int int1, int int2, const char *msg, ...) @@ -349,6 +352,7 @@ __virRaiseError(virConnectPtr conn, virD virResetError(to); to->conn = conn; to->dom = dom; + to->net = net; to->domain = domain; to->code = code; to->message = str; Index: libvirt/src/xen_internal.c =================================================================== --- libvirt.orig/src/xen_internal.c +++ libvirt/src/xen_internal.c @@ -476,7 +476,7 @@ virXenError(virErrorNumber error, const return; errmsg = __virErrorMsg(error, info); - __virRaiseError(NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR, + __virRaiseError(NULL, NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR, errmsg, info, NULL, value, 0, errmsg, info, value); } Index: libvirt/src/xend_internal.c =================================================================== --- libvirt.orig/src/xend_internal.c +++ libvirt/src/xend_internal.c @@ -153,7 +153,7 @@ virXendError(virConnectPtr conn, virErro return; errmsg = __virErrorMsg(error, info); - __virRaiseError(conn, NULL, VIR_FROM_XEND, error, VIR_ERR_ERROR, + __virRaiseError(conn, NULL, NULL, VIR_FROM_XEND, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info); } @@ -174,7 +174,7 @@ virXendErrorInt(virConnectPtr conn, virE return; errmsg = __virErrorMsg(error, NULL); - __virRaiseError(conn, NULL, VIR_FROM_XEND, error, VIR_ERR_ERROR, + __virRaiseError(conn, NULL, NULL, VIR_FROM_XEND, error, VIR_ERR_ERROR, errmsg, NULL, NULL, val, 0, errmsg, val); } Index: libvirt/src/xm_internal.c =================================================================== --- libvirt.orig/src/xm_internal.c +++ libvirt/src/xm_internal.c @@ -116,7 +116,7 @@ xenXMError(virConnectPtr conn, virErrorN return; errmsg = __virErrorMsg(error, info); - __virRaiseError(conn, NULL, VIR_FROM_XEND, error, VIR_ERR_ERROR, + __virRaiseError(conn, NULL, NULL, VIR_FROM_XEND, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info); } Index: libvirt/src/xml.c =================================================================== --- libvirt.orig/src/xml.c +++ libvirt/src/xml.c @@ -34,7 +34,7 @@ virXMLError(virErrorNumber error, const return; errmsg = __virErrorMsg(error, info); - __virRaiseError(NULL, NULL, VIR_FROM_XML, error, VIR_ERR_ERROR, + __virRaiseError(NULL, NULL, NULL, VIR_FROM_XML, error, VIR_ERR_ERROR, errmsg, info, NULL, value, 0, errmsg, info, value); } Index: libvirt/src/xmlrpc.c =================================================================== --- libvirt.orig/src/xmlrpc.c +++ libvirt/src/xmlrpc.c @@ -39,7 +39,7 @@ static void xmlRpcError(virErrorNumber e return; errmsg = __virErrorMsg(error, info); - __virRaiseError(NULL, NULL, VIR_FROM_RPC, error, VIR_ERR_ERROR, + __virRaiseError(NULL, NULL, NULL, VIR_FROM_RPC, error, VIR_ERR_ERROR, errmsg, info, NULL, value, 0, errmsg, info, value); } Index: libvirt/src/xs_internal.c =================================================================== --- libvirt.orig/src/xs_internal.c +++ libvirt/src/xs_internal.c @@ -106,7 +106,7 @@ virXenStoreError(virConnectPtr conn, vir return; errmsg = __virErrorMsg(error, info); - __virRaiseError(conn, NULL, VIR_FROM_XENSTORE, error, VIR_ERR_ERROR, + __virRaiseError(conn, NULL, NULL, VIR_FROM_XENSTORE, error, VIR_ERR_ERROR, errmsg, info, NULL, 0, 0, errmsg, info); } --