From: "Daniel P. Berrange" <berrange(a)redhat.com>
Add a VIR_ERR_NUMBER_LAST sentinel for virErrorNumber and replace
the virErrorStr function by a VIR_ENUM_IMPL. Once this is done
all callers of virRaiseErrorFull are simply passing in a constant
string message with "%s" as the format arg. Thus virRaiseErrorFull
can have its var-args removed.
* include/libvirt/virterror.h: Add VIR_ERR_NUMBER_LAST sentinel
* src/rpc/virnetclientprogram.c, src/rpc/virnetclientstream.c:
Remove format string passed to virRaiseErrorFull
* src/util/virterror.c: Remove var-args from virRaiseErrorFull
and replace virErrorStr with an VIR_ENUM
* src/util/virterror_internal.h: Remove var-args from
virRaiseErrorFull
* tests/cpuset, tests/undefine, tests/virsh-optparse: Adapt
for changes in error message
---
include/libvirt/virterror.h | 37 +++
src/rpc/virnetclientprogram.c | 4 +-
src/rpc/virnetclientstream.c | 2 +-
src/util/virterror.c | 702 +++++++++--------------------------------
src/util/virterror_internal.h | 3 +-
tests/cpuset | 2 +-
tests/undefine | 2 +-
tests/virsh-optparse | 2 +-
8 files changed, 193 insertions(+), 561 deletions(-)
diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h
index 0e0bc9c..6ae1f6d 100644
--- a/include/libvirt/virterror.h
+++ b/include/libvirt/virterror.h
@@ -172,27 +172,37 @@ typedef enum {
VIR_ERR_NO_MEMORY = 2, /* memory allocation failure */
VIR_ERR_NO_SUPPORT = 3, /* no support for this function */
VIR_ERR_UNKNOWN_HOST = 4, /* could not resolve hostname */
+
+
VIR_ERR_NO_CONNECT = 5, /* can't connect to hypervisor */
VIR_ERR_INVALID_CONN = 6, /* invalid connection object */
VIR_ERR_INVALID_DOMAIN = 7, /* invalid domain object */
VIR_ERR_INVALID_ARG = 8, /* invalid function argument */
VIR_ERR_OPERATION_FAILED = 9, /* a command to hypervisor failed */
+
+
VIR_ERR_GET_FAILED = 10, /* a HTTP GET command to failed */
VIR_ERR_POST_FAILED = 11, /* a HTTP POST command to failed */
VIR_ERR_HTTP_ERROR = 12, /* unexpected HTTP error code */
VIR_ERR_SEXPR_SERIAL = 13, /* failure to serialize an S-Expr */
VIR_ERR_NO_XEN = 14, /* could not open Xen hypervisor
control */
+
+
VIR_ERR_XEN_CALL = 15, /* failure doing an hypervisor call */
VIR_ERR_OS_TYPE = 16, /* unknown OS type */
VIR_ERR_NO_KERNEL = 17, /* missing kernel information */
VIR_ERR_NO_ROOT = 18, /* missing root device information */
VIR_ERR_NO_SOURCE = 19, /* missing source device information */
+
+
VIR_ERR_NO_TARGET = 20, /* missing target device information */
VIR_ERR_NO_NAME = 21, /* missing domain name information */
VIR_ERR_NO_OS = 22, /* missing domain OS information */
VIR_ERR_NO_DEVICE = 23, /* missing domain devices information */
VIR_ERR_NO_XENSTORE = 24, /* could not open Xen Store control */
+
+
VIR_ERR_DRIVER_FULL = 25, /* too many drivers registered */
VIR_ERR_CALL_FAILED = 26, /* not supported by the drivers
(DEPRECATED) */
@@ -201,33 +211,45 @@ typedef enum {
VIR_ERR_DOM_EXIST = 28, /* the domain already exist */
VIR_ERR_OPERATION_DENIED = 29, /* operation forbidden on read-only
connections */
+
+
VIR_ERR_OPEN_FAILED = 30, /* failed to open a conf file */
VIR_ERR_READ_FAILED = 31, /* failed to read a conf file */
VIR_ERR_PARSE_FAILED = 32, /* failed to parse a conf file */
VIR_ERR_CONF_SYNTAX = 33, /* failed to parse the syntax of a
conf file */
VIR_ERR_WRITE_FAILED = 34, /* failed to write a conf file */
+
+
VIR_ERR_XML_DETAIL = 35, /* detail of an XML error */
VIR_ERR_INVALID_NETWORK = 36, /* invalid network object */
VIR_ERR_NETWORK_EXIST = 37, /* the network already exist */
VIR_ERR_SYSTEM_ERROR = 38, /* general system call failure */
VIR_ERR_RPC = 39, /* some sort of RPC error */
+
+
VIR_ERR_GNUTLS_ERROR = 40, /* error from a GNUTLS call */
VIR_WAR_NO_NETWORK = 41, /* failed to start network */
VIR_ERR_NO_DOMAIN = 42, /* domain not found or unexpectedly
disappeared */
VIR_ERR_NO_NETWORK = 43, /* network not found */
VIR_ERR_INVALID_MAC = 44, /* invalid MAC address */
+
+
VIR_ERR_AUTH_FAILED = 45, /* authentication failed */
VIR_ERR_INVALID_STORAGE_POOL = 46, /* invalid storage pool object */
VIR_ERR_INVALID_STORAGE_VOL = 47, /* invalid storage vol object */
VIR_WAR_NO_STORAGE = 48, /* failed to start storage */
VIR_ERR_NO_STORAGE_POOL = 49, /* storage pool not found */
+
+
VIR_ERR_NO_STORAGE_VOL = 50, /* storage volume not found */
VIR_WAR_NO_NODE = 51, /* failed to start node driver */
VIR_ERR_INVALID_NODE_DEVICE = 52, /* invalid node device object */
VIR_ERR_NO_NODE_DEVICE = 53, /* node device not found */
VIR_ERR_NO_SECURITY_MODEL = 54, /* security model not found */
+
+
VIR_ERR_OPERATION_INVALID = 55, /* operation is not applicable at this
time */
VIR_WAR_NO_INTERFACE = 56, /* failed to start interface driver */
@@ -235,11 +257,15 @@ typedef enum {
VIR_ERR_INVALID_INTERFACE = 58, /* invalid interface object */
VIR_ERR_MULTIPLE_INTERFACES = 59, /* more than one matching interface
found */
+
+
VIR_WAR_NO_NWFILTER = 60, /* failed to start nwfilter driver */
VIR_ERR_INVALID_NWFILTER = 61, /* invalid nwfilter object */
VIR_ERR_NO_NWFILTER = 62, /* nw filter pool not found */
VIR_ERR_BUILD_FIREWALL = 63, /* nw filter pool not found */
VIR_WAR_NO_SECRET = 64, /* failed to start secret storage */
+
+
VIR_ERR_INVALID_SECRET = 65, /* invalid secret */
VIR_ERR_NO_SECRET = 66, /* secret not found */
VIR_ERR_CONFIG_UNSUPPORTED = 67, /* unsupported configuration
@@ -247,12 +273,16 @@ typedef enum {
VIR_ERR_OPERATION_TIMEOUT = 68, /* timeout occurred during operation */
VIR_ERR_MIGRATE_PERSIST_FAILED = 69,/* a migration worked, but making the
VM persist on the dest host failed */
+
+
VIR_ERR_HOOK_SCRIPT_FAILED = 70, /* a synchronous hook script failed */
VIR_ERR_INVALID_DOMAIN_SNAPSHOT = 71,/* invalid domain snapshot */
VIR_ERR_NO_DOMAIN_SNAPSHOT = 72, /* domain snapshot not found */
VIR_ERR_INVALID_STREAM = 73, /* stream pointer not valid */
VIR_ERR_ARGUMENT_UNSUPPORTED = 74, /* valid API use but unsupported by
the given driver */
+
+
VIR_ERR_STORAGE_PROBE_FAILED = 75, /* storage pool probe failed */
VIR_ERR_STORAGE_POOL_BUILT = 76, /* storage pool already built */
VIR_ERR_SNAPSHOT_REVERT_RISKY = 77, /* force was not requested for a
@@ -260,10 +290,17 @@ typedef enum {
VIR_ERR_OPERATION_ABORTED = 78, /* operation on a domain was
canceled/aborted by user */
VIR_ERR_AUTH_CANCELLED = 79, /* authentication cancelled */
+
+
VIR_ERR_NO_DOMAIN_METADATA = 80, /* The metadata is not present */
VIR_ERR_MIGRATE_UNSAFE = 81, /* Migration is not safe */
VIR_ERR_OVERFLOW = 82, /* integer overflow */
VIR_ERR_BLOCK_COPY_ACTIVE = 83, /* action prevented by block copy job */
+
+
+# ifdef VIR_ENUM_SENTINELS
+ VIR_ERR_NUMBER_LAST
+# endif
} virErrorNumber;
/**
diff --git a/src/rpc/virnetclientprogram.c b/src/rpc/virnetclientprogram.c
index e1e8846..383c0f5 100644
--- a/src/rpc/virnetclientprogram.c
+++ b/src/rpc/virnetclientprogram.c
@@ -169,7 +169,7 @@ virNetClientProgramDispatchError(virNetClientProgramPtr prog
ATTRIBUTE_UNUSED,
err.str3 ? *err.str3 : NULL,
err.int1,
err.int2,
- "%s", *err.message);
+ *err.message);
} else {
virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__,
err.domain,
@@ -180,7 +180,7 @@ virNetClientProgramDispatchError(virNetClientProgramPtr prog
ATTRIBUTE_UNUSED,
err.str3 ? *err.str3 : NULL,
err.int1,
err.int2,
- "%s", err.message ? *err.message : _("Unknown
error"));
+ err.message ? *err.message : NULL);
}
ret = 0;
diff --git a/src/rpc/virnetclientstream.c b/src/rpc/virnetclientstream.c
index be06c66..84ed5d7 100644
--- a/src/rpc/virnetclientstream.c
+++ b/src/rpc/virnetclientstream.c
@@ -215,7 +215,7 @@ bool virNetClientStreamRaiseError(virNetClientStreamPtr st)
st->err.str3,
st->err.int1,
st->err.int2,
- "%s", st->err.message ? st->err.message :
_("Unknown error"));
+ st->err.message);
virMutexUnlock(&st->lock);
return true;
}
diff --git a/src/util/virterror.c b/src/util/virterror.c
index fa57833..1449863 100644
--- a/src/util/virterror.c
+++ b/src/util/virterror.c
@@ -21,6 +21,7 @@
#include "memory.h"
#include "threads.h"
#include "util.h"
+#include "ignore-value.h"
virThreadLocal virLastErr;
@@ -103,6 +104,110 @@ VIR_ENUM_IMPL(virErrorDomain, VIR_ERR_DOMAIN_LAST,
)
+VIR_ENUM_DECL(virErrorNumber)
+VIR_ENUM_IMPL(virErrorNumber, VIR_ERR_NUMBER_LAST,
+ N_(""), /* 0 */
+ N_("internal error"),
+ N_("out of memory"),
+ N_("this function is not supported by the current driver"),
+ N_("unknown hostname"),
+
+ N_("no connection driver available"), /* 5 */
+ N_("invalid connection pointer"),
+ N_("invalid domain pointer"),
+ N_("invalid argument"),
+ N_("operation failed"),
+
+ N_("HTTP GET request failed"), /* 10 */
+ N_("HTTP POST request failed"),
+ N_("unknown HTTP error code"),
+ N_("failed to serialize S-expression"),
+ N_("unable to use Xen hypervisor"),
+
+ N_("failed Xen hypercall"), /* 15 */
+ N_("unknown OS type"),
+ N_("missing kernel path"),
+ N_("missing root device name"),
+ N_("missing source information for device"),
+
+ N_("missing target information for device"), /* 20 */
+ N_("missing name information"),
+ N_("missing operating system information"),
+ N_("missing device list"),
+ N_("unable to use XenStore daemon"),
+
+ N_("too many drivers registered"), /* 25 */
+ N_("library call failed, possibly not supported"),
+ N_("XML description is invalid or not well formed"),
+ N_("domain exists already"),
+ N_("operation forbidden for read only access"),
+
+ N_("failed to open configuration file"), /* 30 */
+ N_("failed to read configuration file"),
+ N_("failed to parse configuration file"),
+ N_("configuration file syntax error"),
+ N_("failed to write configuration file"),
+
+ N_("XML parser error"), /* 35 */
+ N_("invalid network pointer"),
+ N_("network exists already"),
+ N_("system call error"),
+ N_("RPC error"),
+
+ N_("GNUTLS call error"), /* 40 */
+ N_("failed to find a network driver"),
+ N_("domain not found"),
+ N_("network not found"),
+ N_("invalid MAC address"),
+
+ N_("authentication failed"), /* 45 */
+ N_("invalid storage pool pointer"),
+ N_("invalid storage volume pointer"),
+ N_("failed to find a storage driver"),
+ N_("storage pool not found"),
+
+ N_("storage volume not found"), /* 50 */
+ N_("failed to find a node device driver"),
+ N_("invalid node device pointer"),
+ N_("node device not found"),
+ N_("security model not found"),
+
+ N_("requested operation is not valid"), /* 55 */
+ N_("failed to find a network interface driver"),
+ N_("interface not found"),
+ N_("invalid interface pointer"),
+ N_("multiple matching interfaces found"),
+
+ N_("failed to find a network filter driver"), /* 60 */
+ N_("invalid network filter"),
+ N_("network filter not found"),
+ N_("error while building firewall"),
+ N_("failed to find a secret driver"),
+
+ N_("invalid secret pointer"), /* 65 */
+ N_("secret not found"),
+ N_("unsupported configuration"),
+ N_("timed out during operation"),
+ N_("failed to make domain persistent after migration"),
+
+ N_("hook script execution failed"), /* 70 */
+ N_("invalid snapshot pointer"),
+ N_("domain snapshot not found"),
+ N_("invalid stream pointer"),
+ N_("argument unsupported"),
+
+ N_("storage pool probe failed"), /* 75 */
+ N_("storage pool already built"),
+ N_("revert requires force"),
+ N_("operation aborted"),
+ N_("authentication cancelled"),
+
+ N_("metadata not found"), /* 80 */
+ N_("unsafe migration"),
+ N_("numerical overflow"),
+ N_("block copy still active"),
+ )
+
/*
* Internal helper that is called when a thread exits, to
* release the error object stored in the thread local
@@ -576,8 +681,7 @@ virDispatchError(virConnectPtr conn)
* @str3: extra string info
* @int1: extra int info
* @int2: extra int info
- * @fmt: the message to display/transmit
- * @...: extra parameters for the message display
+ * @msg: the pre-formatted message to display/transmit
*
* Internal routine called when an error is detected. It will raise it
* immediately if a callback is found and store it for later handling.
@@ -594,11 +698,10 @@ virRaiseErrorFull(const char *filename ATTRIBUTE_UNUSED,
const char *str3,
int int1,
int int2,
- const char *fmt, ...)
+ const char *msg)
{
int save_errno = errno;
virErrorPtr to;
- char *str;
int priority;
/*
@@ -620,18 +723,6 @@ virRaiseErrorFull(const char *filename ATTRIBUTE_UNUSED,
}
/*
- * formats the message; drop message on OOM situations
- */
- if (fmt == NULL) {
- str = strdup(_("No error message provided"));
- } else {
- va_list ap;
- va_start(ap, fmt);
- virVasprintf(&str, fmt, ap);
- va_end(ap);
- }
-
- /*
* Save the information about the error
*/
/*
@@ -640,7 +731,7 @@ virRaiseErrorFull(const char *filename ATTRIBUTE_UNUSED,
*/
to->domain = domain;
to->code = code;
- to->message = str;
+ to->message = strdup(msg);
to->level = level;
if (str1 != NULL)
to->str1 = strdup(str1);
@@ -661,518 +752,11 @@ virRaiseErrorFull(const char *filename ATTRIBUTE_UNUSED,
virLogMessage(filename, priority,
funcname, linenr,
virErrorLogPriorityFilter ? 0 : 1,
- "%s", str);
+ "%s", msg);
errno = save_errno;
}
-/**
- * virErrorMsg:
- * @error: the virErrorNumber
- * @info: usually the first parameter string
- *
- * Internal routine to get the message associated to an error raised
- * from the library
- *
- * Returns the constant string associated to @error
- */
-static const char *
-virErrorMsg(virErrorNumber error, const char *info)
-{
- const char *errmsg = NULL;
-
- switch (error) {
- case VIR_ERR_OK:
- return NULL;
- case VIR_ERR_INTERNAL_ERROR:
- if (info != NULL)
- errmsg = _("internal error %s");
- else
- errmsg = _("internal error");
- break;
- case VIR_ERR_NO_MEMORY:
- errmsg = _("out of memory");
- break;
- case VIR_ERR_NO_SUPPORT:
- if (info == NULL)
- errmsg = _("this function is not supported by the connection
driver");
- else
- errmsg = _("this function is not supported by the connection driver:
%s");
- break;
- case VIR_ERR_NO_CONNECT:
- if (info == NULL)
- errmsg = _("no connection driver available");
- else
- errmsg = _("no connection driver available for %s");
- break;
- case VIR_ERR_INVALID_CONN:
- if (info == NULL)
- errmsg = _("invalid connection pointer in");
- else
- errmsg = _("invalid connection pointer in %s");
- break;
- case VIR_ERR_INVALID_DOMAIN:
- if (info == NULL)
- errmsg = _("invalid domain pointer in");
- else
- errmsg = _("invalid domain pointer in %s");
- break;
- case VIR_ERR_INVALID_ARG:
- if (info == NULL)
- errmsg = _("invalid argument");
- else
- errmsg = _("invalid argument: %s");
- break;
- case VIR_ERR_OPERATION_FAILED:
- if (info != NULL)
- errmsg = _("operation failed: %s");
- else
- errmsg = _("operation failed");
- break;
- case VIR_ERR_GET_FAILED:
- if (info != NULL)
- errmsg = _("GET operation failed: %s");
- else
- errmsg = _("GET operation failed");
- break;
- case VIR_ERR_POST_FAILED:
- if (info != NULL)
- errmsg = _("POST operation failed: %s");
- else
- errmsg = _("POST operation failed");
- break;
- case VIR_ERR_HTTP_ERROR:
- errmsg = _("got unknown HTTP error code %d");
- break;
- case VIR_ERR_UNKNOWN_HOST:
- if (info != NULL)
- errmsg = _("unknown host %s");
- else
- errmsg = _("unknown host");
- break;
- case VIR_ERR_SEXPR_SERIAL:
- if (info != NULL)
- errmsg = _("failed to serialize S-Expr: %s");
- else
- errmsg = _("failed to serialize S-Expr");
- break;
- case VIR_ERR_NO_XEN:
- if (info == NULL)
- errmsg = _("could not use Xen hypervisor entry");
- else
- errmsg = _("could not use Xen hypervisor entry %s");
- break;
- case VIR_ERR_NO_XENSTORE:
- if (info == NULL)
- errmsg = _("could not connect to Xen Store");
- else
- errmsg = _("could not connect to Xen Store %s");
- break;
- case VIR_ERR_XEN_CALL:
- errmsg = _("failed Xen syscall %s");
- break;
- case VIR_ERR_OS_TYPE:
- if (info == NULL)
- errmsg = _("unknown OS type");
- else
- errmsg = _("unknown OS type %s");
- break;
- case VIR_ERR_NO_KERNEL:
- errmsg = _("missing kernel information");
- break;
- case VIR_ERR_NO_ROOT:
- if (info == NULL)
- errmsg = _("missing root device information");
- else
- errmsg = _("missing root device information in %s");
- break;
- case VIR_ERR_NO_SOURCE:
- if (info == NULL)
- errmsg = _("missing source information for device");
- else
- errmsg = _("missing source information for device %s");
- break;
- case VIR_ERR_NO_TARGET:
- if (info == NULL)
- errmsg = _("missing target information for device");
- else
- errmsg = _("missing target information for device %s");
- break;
- case VIR_ERR_NO_NAME:
- if (info == NULL)
- errmsg = _("missing name information");
- else
- errmsg = _("missing name information in %s");
- break;
- case VIR_ERR_NO_OS:
- if (info == NULL)
- errmsg = _("missing operating system information");
- else
- errmsg = _("missing operating system information for %s");
- break;
- case VIR_ERR_NO_DEVICE:
- if (info == NULL)
- errmsg = _("missing devices information");
- else
- errmsg = _("missing devices information for %s");
- break;
- case VIR_ERR_DRIVER_FULL:
- if (info == NULL)
- errmsg = _("too many drivers registered");
- else
- errmsg = _("too many drivers registered in %s");
- break;
- case VIR_ERR_CALL_FAILED: /* DEPRECATED, use VIR_ERR_NO_SUPPORT */
- if (info == NULL)
- errmsg = _("library call failed, possibly not supported");
- else
- errmsg = _("library call %s failed, possibly not supported");
- break;
- case VIR_ERR_XML_ERROR:
- if (info == NULL)
- errmsg = _("XML description is invalid or not well formed");
- else
- errmsg = _("XML error: %s");
- break;
- case VIR_ERR_DOM_EXIST:
- if (info == NULL)
- errmsg = _("this domain exists already");
- else
- errmsg = _("domain %s exists already");
- break;
- case VIR_ERR_OPERATION_DENIED:
- if (info == NULL)
- errmsg = _("operation forbidden for read only access");
- else
- errmsg = _("operation %s forbidden for read only access");
- break;
- case VIR_ERR_OPEN_FAILED:
- if (info == NULL)
- errmsg = _("failed to open configuration file for reading");
- else
- errmsg = _("failed to open %s for reading");
- break;
- case VIR_ERR_READ_FAILED:
- if (info == NULL)
- errmsg = _("failed to read configuration file");
- else
- errmsg = _("failed to read configuration file %s");
- break;
- case VIR_ERR_PARSE_FAILED:
- if (info == NULL)
- errmsg = _("failed to parse configuration file");
- else
- errmsg = _("failed to parse configuration file %s");
- break;
- case VIR_ERR_CONF_SYNTAX:
- if (info == NULL)
- errmsg = _("configuration file syntax error");
- else
- errmsg = _("configuration file syntax error: %s");
- break;
- case VIR_ERR_WRITE_FAILED:
- if (info == NULL)
- errmsg = _("failed to write configuration file");
- else
- errmsg = _("failed to write configuration file: %s");
- break;
- case VIR_ERR_XML_DETAIL:
- if (info == NULL)
- errmsg = _("parser error");
- else
- errmsg = "%s";
- break;
- case VIR_ERR_INVALID_NETWORK:
- if (info == NULL)
- errmsg = _("invalid network pointer in");
- else
- errmsg = _("invalid network pointer in %s");
- break;
- case VIR_ERR_NETWORK_EXIST:
- if (info == NULL)
- errmsg = _("this network exists already");
- else
- errmsg = _("network %s exists already");
- break;
- case VIR_ERR_SYSTEM_ERROR:
- if (info == NULL)
- errmsg = _("system call error");
- else
- errmsg = "%s";
- break;
- case VIR_ERR_RPC:
- if (info == NULL)
- errmsg = _("RPC error");
- else
- errmsg = "%s";
- break;
- case VIR_ERR_GNUTLS_ERROR:
- if (info == NULL)
- errmsg = _("GNUTLS call error");
- else
- errmsg = "%s";
- break;
- case VIR_WAR_NO_NETWORK:
- if (info == NULL)
- errmsg = _("Failed to find the network");
- else
- errmsg = _("Failed to find the network: %s");
- break;
- case VIR_ERR_NO_DOMAIN:
- if (info == NULL)
- errmsg = _("Domain not found");
- else
- errmsg = _("Domain not found: %s");
- break;
- case VIR_ERR_NO_NETWORK:
- if (info == NULL)
- errmsg = _("Network not found");
- else
- errmsg = _("Network not found: %s");
- break;
- case VIR_ERR_INVALID_MAC:
- if (info == NULL)
- errmsg = _("invalid MAC address");
- else
- errmsg = _("invalid MAC address: %s");
- break;
- case VIR_ERR_AUTH_FAILED:
- if (info == NULL)
- errmsg = _("authentication failed");
- else
- errmsg = _("authentication failed: %s");
- break;
- case VIR_ERR_AUTH_CANCELLED:
- if (info == NULL)
- errmsg = _("authentication cancelled");
- else
- errmsg = _("authentication cancelled: %s");
- break;
- case VIR_ERR_NO_STORAGE_POOL:
- if (info == NULL)
- errmsg = _("Storage pool not found");
- else
- errmsg = _("Storage pool not found: %s");
- break;
- case VIR_ERR_NO_STORAGE_VOL:
- if (info == NULL)
- errmsg = _("Storage volume not found");
- else
- errmsg = _("Storage volume not found: %s");
- break;
- case VIR_ERR_STORAGE_PROBE_FAILED:
- if (info == NULL)
- errmsg = _("Storage pool probe failed");
- else
- errmsg = _("Storage pool probe failed: %s");
- break;
- case VIR_ERR_STORAGE_POOL_BUILT:
- if (info == NULL)
- errmsg = _("Storage pool already built");
- else
- errmsg = _("Storage pool already built: %s");
- break;
- case VIR_ERR_INVALID_STORAGE_POOL:
- if (info == NULL)
- errmsg = _("invalid storage pool pointer in");
- else
- errmsg = _("invalid storage pool pointer in %s");
- break;
- case VIR_ERR_INVALID_STORAGE_VOL:
- if (info == NULL)
- errmsg = _("invalid storage volume pointer in");
- else
- errmsg = _("invalid storage volume pointer in %s");
- break;
- case VIR_WAR_NO_STORAGE:
- if (info == NULL)
- errmsg = _("Failed to find a storage driver");
- else
- errmsg = _("Failed to find a storage driver: %s");
- break;
- case VIR_WAR_NO_NODE:
- if (info == NULL)
- errmsg = _("Failed to find a node driver");
- else
- errmsg = _("Failed to find a node driver: %s");
- break;
- case VIR_ERR_INVALID_NODE_DEVICE:
- if (info == NULL)
- errmsg = _("invalid node device pointer");
- else
- errmsg = _("invalid node device pointer in %s");
- break;
- case VIR_ERR_NO_NODE_DEVICE:
- if (info == NULL)
- errmsg = _("Node device not found");
- else
- errmsg = _("Node device not found: %s");
- break;
- case VIR_ERR_NO_SECURITY_MODEL:
- if (info == NULL)
- errmsg = _("Security model not found");
- else
- errmsg = _("Security model not found: %s");
- break;
- case VIR_ERR_OPERATION_INVALID:
- if (info == NULL)
- errmsg = _("Requested operation is not valid");
- else
- errmsg = _("Requested operation is not valid: %s");
- break;
- case VIR_WAR_NO_INTERFACE:
- if (info == NULL)
- errmsg = _("Failed to find the interface");
- else
- errmsg = _("Failed to find the interface: %s");
- break;
- case VIR_ERR_NO_INTERFACE:
- if (info == NULL)
- errmsg = _("Interface not found");
- else
- errmsg = _("Interface not found: %s");
- break;
- case VIR_ERR_INVALID_INTERFACE:
- if (info == NULL)
- errmsg = _("invalid interface pointer in");
- else
- errmsg = _("invalid interface pointer in %s");
- break;
- case VIR_ERR_MULTIPLE_INTERFACES:
- if (info == NULL)
- errmsg = _("multiple matching interfaces found");
- else
- errmsg = _("multiple matching interfaces found: %s");
- break;
- case VIR_WAR_NO_SECRET:
- if (info == NULL)
- errmsg = _("Failed to find a secret storage driver");
- else
- errmsg = _("Failed to find a secret storage driver: %s");
- break;
- case VIR_ERR_INVALID_SECRET:
- if (info == NULL)
- errmsg = _("Invalid secret");
- else
- errmsg = _("Invalid secret: %s");
- break;
- case VIR_ERR_NO_SECRET:
- if (info == NULL)
- errmsg = _("Secret not found");
- else
- errmsg = _("Secret not found: %s");
- break;
- case VIR_WAR_NO_NWFILTER:
- if (info == NULL)
- errmsg = _("Failed to start the nwfilter driver");
- else
- errmsg = _("Failed to start the nwfilter driver: %s");
- break;
- case VIR_ERR_INVALID_NWFILTER:
- if (info == NULL)
- errmsg = _("Invalid network filter");
- else
- errmsg = _("Invalid network filter: %s");
- break;
- case VIR_ERR_NO_NWFILTER:
- if (info == NULL)
- errmsg = _("Network filter not found");
- else
- errmsg = _("Network filter not found: %s");
- break;
- case VIR_ERR_BUILD_FIREWALL:
- if (info == NULL)
- errmsg = _("Error while building firewall");
- else
- errmsg = _("Error while building firewall: %s");
- break;
- case VIR_ERR_CONFIG_UNSUPPORTED:
- if (info == NULL)
- errmsg = _("unsupported configuration");
- else
- errmsg = _("unsupported configuration: %s");
- break;
- case VIR_ERR_OPERATION_TIMEOUT:
- if (info == NULL)
- errmsg = _("Timed out during operation");
- else
- errmsg = _("Timed out during operation: %s");
- break;
- case VIR_ERR_MIGRATE_PERSIST_FAILED:
- if (info == NULL)
- errmsg = _("Failed to make domain persistent after
migration");
- else
- errmsg = _("Failed to make domain persistent after migration:
%s");
- break;
- case VIR_ERR_HOOK_SCRIPT_FAILED:
- if (info == NULL)
- errmsg = _("Hook script execution failed");
- else
- errmsg = _("Hook script execution failed: %s");
- break;
- case VIR_ERR_INVALID_DOMAIN_SNAPSHOT:
- if (info == NULL)
- errmsg = _("Invalid snapshot");
- else
- errmsg = _("Invalid snapshot: %s");
- break;
- case VIR_ERR_NO_DOMAIN_SNAPSHOT:
- if (info == NULL)
- errmsg = _("Domain snapshot not found");
- else
- errmsg = _("Domain snapshot not found: %s");
- break;
- case VIR_ERR_INVALID_STREAM:
- if (info == NULL)
- errmsg = _("invalid stream pointer");
- else
- errmsg = _("invalid stream pointer in %s");
- break;
- case VIR_ERR_ARGUMENT_UNSUPPORTED:
- if (info == NULL)
- errmsg = _("argument unsupported");
- else
- errmsg = _("argument unsupported: %s");
- break;
- case VIR_ERR_SNAPSHOT_REVERT_RISKY:
- if (info == NULL)
- errmsg = _("revert requires force");
- else
- errmsg = _("revert requires force: %s");
- break;
- case VIR_ERR_OPERATION_ABORTED:
- if (info == NULL)
- errmsg = _("operation aborted");
- else
- errmsg = _("operation aborted: %s");
- break;
- case VIR_ERR_NO_DOMAIN_METADATA:
- if (info == NULL)
- errmsg = _("metadata not found");
- else
- errmsg = _("metadata not found: %s");
- break;
- case VIR_ERR_MIGRATE_UNSAFE:
- if (!info)
- errmsg = _("Unsafe migration");
- else
- errmsg = _("Unsafe migration: %s");
- break;
- case VIR_ERR_OVERFLOW:
- if (!info)
- errmsg = _("numerical overflow");
- else
- errmsg = _("numerical overflow: %s");
- break;
- case VIR_ERR_BLOCK_COPY_ACTIVE:
- if (!info)
- errmsg = _("block copy still active");
- else
- errmsg = _("block copy still active: %s");
- break;
- }
- return errmsg;
-}
/**
* virReportErrorHelper:
@@ -1196,23 +780,41 @@ void virReportErrorHelper(int domcode,
const char *fmt, ...)
{
int save_errno = errno;
- va_list args;
- char errorMessage[1024];
- const char *virerr;
+ char *msg = NULL;
+ char *fmtmsg = NULL;
+ const char *virerr = gettext(virErrorNumberTypeToString(errorcode));
+
+ /* Special case a couple of codes where we don't want to
+ * prepend some worthless generic message, to a detailed
+ * piece of info */
+ if ((errorcode == VIR_ERR_GNUTLS_ERROR ||
+ errorcode == VIR_ERR_RPC ||
+ errorcode == VIR_ERR_SYSTEM_ERROR)
+ && fmt)
+ virerr = NULL;
if (fmt) {
+ va_list args;
+
va_start(args, fmt);
- vsnprintf(errorMessage, sizeof(errorMessage)-1, fmt, args);
+ ignore_value(virVasprintf(&fmtmsg, fmt, args));
va_end(args);
- } else {
- errorMessage[0] = '\0';
+
+ if (fmtmsg && virerr) {
+ ignore_value(virAsprintf(&msg, "%s: %s", virerr, fmtmsg));
+ } else if (fmtmsg) {
+ msg = fmtmsg;
+ fmtmsg = NULL;
+ }
}
- virerr = virErrorMsg(errorcode, (errorMessage[0] ? errorMessage : NULL));
virRaiseErrorFull(filename, funcname, linenr,
domcode, errorcode, VIR_ERR_ERROR,
- virerr, errorMessage, NULL,
- -1, -1, virerr, errorMessage);
+ virerr, fmtmsg, NULL,
+ -1, -1,
+ msg ? msg : virerr);
+ VIR_FREE(msg);
+ VIR_FREE(fmtmsg);
errno = save_errno;
}
@@ -1259,35 +861,30 @@ void virReportSystemErrorFull(int domcode,
{
int save_errno = errno;
char strerror_buf[1024];
- char msgDetailBuf[1024];
-
+ const char *virerr = gettext(virErrorNumberTypeToString(VIR_ERR_SYSTEM_ERROR));
const char *errnoDetail = virStrerror(theerrno, strerror_buf,
sizeof(strerror_buf));
- const char *msg = virErrorMsg(VIR_ERR_SYSTEM_ERROR, fmt);
- const char *msgDetail = NULL;
+ char *msg = NULL;
+ char *fmtmsg;
if (fmt) {
va_list args;
- int n;
va_start(args, fmt);
- n = vsnprintf(msgDetailBuf, sizeof(msgDetailBuf), fmt, args);
+ ignore_value(virVasprintf(&fmtmsg, fmt, args));
va_end(args);
- size_t len = strlen(errnoDetail);
- if (0 <= n && n + 2 + len < sizeof(msgDetailBuf)) {
- char *p = msgDetailBuf + n;
- stpcpy (stpcpy (p, ": "), errnoDetail);
- msgDetail = msgDetailBuf;
- }
+ if (fmtmsg)
+ ignore_value(virAsprintf(&msg, "%s: %s", fmtmsg,
errnoDetail));
}
- if (!msgDetail)
- msgDetail = errnoDetail;
-
virRaiseErrorFull(filename, funcname, linenr,
domcode, VIR_ERR_SYSTEM_ERROR, VIR_ERR_ERROR,
- msg, msgDetail, NULL, -1, -1, msg, msgDetail);
+ virerr, fmtmsg, errnoDetail,
+ -1, -1,
+ msg ? msg : errnoDetail);
+ VIR_FREE(fmtmsg);
+ VIR_FREE(msg);
errno = save_errno;
}
@@ -1307,11 +904,10 @@ void virReportOOMErrorFull(int domcode,
size_t linenr)
{
const char *virerr;
-
- virerr = virErrorMsg(VIR_ERR_NO_MEMORY, NULL);
+ virerr = gettext(virErrorNumberTypeToString(VIR_ERR_NO_MEMORY));
virRaiseErrorFull(filename, funcname, linenr,
domcode, VIR_ERR_NO_MEMORY, VIR_ERR_ERROR,
- virerr, NULL, NULL, -1, -1, virerr, NULL);
+ virerr, NULL, NULL, -1, -1, virerr);
}
/**
diff --git a/src/util/virterror_internal.h b/src/util/virterror_internal.h
index b8cb279..ffa2d02 100644
--- a/src/util/virterror_internal.h
+++ b/src/util/virterror_internal.h
@@ -44,8 +44,7 @@ void virRaiseErrorFull(const char *filename,
const char *str3,
int int1,
int int2,
- const char *fmt, ...)
- ATTRIBUTE_FMT_PRINTF(12, 13);
+ const char *msg);
void virReportErrorHelper(int domcode, int errcode,
const char *filename,
diff --git a/tests/cpuset b/tests/cpuset
index d638ad6..26f97f0 100755
--- a/tests/cpuset
+++ b/tests/cpuset
@@ -41,7 +41,7 @@ sed "s/vcpu placement='static'>/vcpu
cpuset='aaa'>/" xml > xml-invalid || fail=1
$abs_top_builddir/tools/virsh --connect test:///default define xml-invalid > out
2>&1 && fail=1
cat <<\EOF > exp || fail=1
error: Failed to define domain from xml-invalid
-error: internal error topology cpuset syntax error
+error: internal error: topology cpuset syntax error
EOF
compare exp out || fail=1
diff --git a/tests/undefine b/tests/undefine
index 22d6c14..59771b6 100755
--- a/tests/undefine
+++ b/tests/undefine
@@ -64,7 +64,7 @@ cat <<\EOF > expout || fail=1
Domain test is being shutdown
Domain test has been undefined
error: failed to get domain 'test'
-error: Domain not found
+error: domain not found
EOF
compare expout out || fail=1
diff --git a/tests/virsh-optparse b/tests/virsh-optparse
index fc2279f..ce8dd87 100755
--- a/tests/virsh-optparse
+++ b/tests/virsh-optparse
@@ -129,7 +129,7 @@ test -s err && fail=1
# Test a required argv
cat <<\EOF > exp-err || framework_failure
-error: this function is not supported by the connection driver:
virDomainQemuMonitorCommand
+error: this function is not supported by the current driver: virDomainQemuMonitorCommand
EOF
virsh -q -c $test_url qemu-monitor-command test a >out 2>err && fail=1
test -s out && fail=1
--
1.7.10.1