[libvirt] [PATCH 08/10] util: error: Use a more declarative approach in virErrorMsg

Peter Krempa pkrempa at redhat.com
Wed Dec 5 16:47:49 UTC 2018


Use a macro to declare how the strings for individual error codes. This
unifies the used condition and will allow simplifying the code further.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/libvirt_private.syms |   1 +
 src/util/virerror.c      | 792 +++++++++------------------------------
 src/util/virerrorpriv.h  |   8 +
 3 files changed, 188 insertions(+), 613 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 6184030d59..775b33e151 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1753,6 +1753,7 @@ virDispatchError;
 virErrorCopyNew;
 virErrorInitialize;
 virErrorMsg;
+virErrorMsgStrings;
 virErrorPreserveLast;
 virErrorRestore;
 virErrorSetErrnoFromLastError;
diff --git a/src/util/virerror.c b/src/util/virerror.c
index 7444d671bb..d3cd06331f 100644
--- a/src/util/virerror.c
+++ b/src/util/virerror.c
@@ -903,6 +903,178 @@ void virRaiseErrorObject(const char *filename,
 }


+const virErrorMsgTuple virErrorMsgStrings[VIR_ERR_NUMBER_LAST] = {
+    { VIR_ERR_OK, NULL, NULL },
+    { VIR_ERR_INTERNAL_ERROR, "internal error", "internal error: %s" },
+    { VIR_ERR_NO_MEMORY, "out of memory", "out of memory: %s" },
+    { VIR_ERR_NO_SUPPORT,
+        "this function is not supported by the connection driver",
+        "this function is not supported by the connection driver: %s" },
+    { VIR_ERR_UNKNOWN_HOST, "unknown host", "unknown host %s" },
+    { VIR_ERR_NO_CONNECT,
+        "no connection driver available",
+        "no connection driver available for %s" },
+    { VIR_ERR_INVALID_CONN, "invalid connection pointer in", "invalid connection pointer in %s" },
+    { VIR_ERR_INVALID_DOMAIN, "invalid domain pointer in", "invalid domain pointer in %s" },
+    { VIR_ERR_INVALID_ARG, "invalid argument", "invalid argument: %s" },
+    { VIR_ERR_OPERATION_FAILED, "operation failed", "operation failed: %s" },
+    { VIR_ERR_GET_FAILED, "GET operation failed", "GET operation failed: %s" },
+    { VIR_ERR_POST_FAILED, "POST operation failed", "POST operation failed: %s" },
+    { VIR_ERR_HTTP_ERROR, "got unknown HTTP error code", "got unknown HTTP error code %s" },
+    { VIR_ERR_SEXPR_SERIAL, "failed to serialize S-Expr", "failed to serialize S-Expr: %s" },
+    { VIR_ERR_NO_XEN,
+        "could not use Xen hypervisor entry",
+        "could not use Xen hypervisor entry %s" },
+    { VIR_ERR_XEN_CALL, "failed Xen syscall", "failed Xen syscall %s" },
+    { VIR_ERR_OS_TYPE, "unknown OS type", "unknown OS type %s" },
+    { VIR_ERR_NO_KERNEL, "missing kernel information", "missing kernel information: %s" },
+    { VIR_ERR_NO_ROOT, "missing root device information", "missing root device information in %s" },
+    { VIR_ERR_NO_SOURCE,
+        "missing source information for device",
+        "missing source information for device %s" },
+    { VIR_ERR_NO_TARGET,
+        "missing target information for device",
+        "missing target information for device %s" },
+    { VIR_ERR_NO_NAME, "missing name information", "missing name information in %s" },
+    { VIR_ERR_NO_OS,
+        "missing operating system information",
+        "missing operating system information for %s" },
+    { VIR_ERR_NO_DEVICE, "missing devices information", "missing devices information for %s" },
+    { VIR_ERR_NO_XENSTORE, "could not connect to Xen Store", "could not connect to Xen Store %s" },
+    { VIR_ERR_DRIVER_FULL, "too many drivers registered", "too many drivers registered in %s" },
+    { VIR_ERR_CALL_FAILED,
+        "library call failed, possibly not supported",
+        "library call %s failed, possibly not supported" },
+    { VIR_ERR_XML_ERROR, "XML description is invalid or not well formed", "XML error: %s" },
+    { VIR_ERR_DOM_EXIST, "this domain exists already", "domain %s exists already" },
+    { VIR_ERR_OPERATION_DENIED,
+        "operation forbidden for read only access",
+        "operation forbidden: %s" },
+    { VIR_ERR_OPEN_FAILED,
+        "failed to open configuration file for reading",
+        "failed to open %s for reading" },
+    { VIR_ERR_READ_FAILED,
+        "failed to read configuration file",
+        "failed to read configuration file %s" },
+    { VIR_ERR_PARSE_FAILED,
+        "failed to parse configuration file",
+        "failed to parse configuration file %s" },
+    { VIR_ERR_CONF_SYNTAX,
+        "configuration file syntax error",
+        "configuration file syntax error: %s" },
+    { VIR_ERR_WRITE_FAILED,
+        "failed to write configuration file",
+        "failed to write configuration file: %s" },
+    { VIR_ERR_XML_DETAIL, "parser error", "%s" },
+    { VIR_ERR_INVALID_NETWORK, "invalid network pointer in", "invalid network pointer in %s" },
+    { VIR_ERR_NETWORK_EXIST, "this network exists already", "network %s exists already" },
+    { VIR_ERR_SYSTEM_ERROR, "system call error", "%s" },
+    { VIR_ERR_RPC, "RPC error", "%s" },
+    { VIR_ERR_GNUTLS_ERROR, "GNUTLS call error", "%s" },
+    { VIR_WAR_NO_NETWORK, "Failed to find the network", "Failed to find the network: %s" },
+    { VIR_ERR_NO_DOMAIN, "Domain not found", "Domain not found: %s" },
+    { VIR_ERR_NO_NETWORK, "Network not found", "Network not found: %s" },
+    { VIR_ERR_INVALID_MAC, "invalid MAC address", "invalid MAC address: %s" },
+    { VIR_ERR_AUTH_FAILED, "authentication failed", "authentication failed: %s" },
+    { VIR_ERR_INVALID_STORAGE_POOL,
+        "invalid storage pool pointer in",
+        "invalid storage pool pointer in %s" },
+    { VIR_ERR_INVALID_STORAGE_VOL,
+        "invalid storage volume pointer in",
+        "invalid storage volume pointer in %s" },
+    { VIR_WAR_NO_STORAGE,
+        "Failed to find a storage driver",
+        "Failed to find a storage driver: %s" },
+    { VIR_ERR_NO_STORAGE_POOL, "Storage pool not found", "Storage pool not found: %s" },
+    { VIR_ERR_NO_STORAGE_VOL, "Storage volume not found", "Storage volume not found: %s" },
+    { VIR_WAR_NO_NODE, "Failed to find a node driver", "Failed to find a node driver: %s" },
+    { VIR_ERR_INVALID_NODE_DEVICE,
+        "invalid node device pointer",
+        "invalid node device pointer in %s" },
+    { VIR_ERR_NO_NODE_DEVICE, "Node device not found", "Node device not found: %s" },
+    { VIR_ERR_NO_SECURITY_MODEL, "Security model not found", "Security model not found: %s" },
+    { VIR_ERR_OPERATION_INVALID,
+        "Requested operation is not valid",
+        "Requested operation is not valid: %s" },
+    { VIR_WAR_NO_INTERFACE, "Failed to find the interface", "Failed to find the interface: %s" },
+    { VIR_ERR_NO_INTERFACE, "Interface not found", "Interface not found: %s" },
+    { VIR_ERR_INVALID_INTERFACE,
+        "invalid interface pointer in",
+        "invalid interface pointer in %s" },
+    { VIR_ERR_MULTIPLE_INTERFACES,
+        "multiple matching interfaces found",
+        "multiple matching interfaces found: %s" },
+    { VIR_WAR_NO_NWFILTER,
+        "Failed to start the nwfilter driver",
+        "Failed to start the nwfilter driver: %s" },
+    { VIR_ERR_INVALID_NWFILTER, "Invalid network filter", "Invalid network filter: %s" },
+    { VIR_ERR_NO_NWFILTER, "Network filter not found", "Network filter not found: %s" },
+    { VIR_ERR_BUILD_FIREWALL,
+        "Error while building firewall",
+        "Error while building firewall: %s" },
+    { VIR_WAR_NO_SECRET,
+        "Failed to find a secret storage driver",
+        "Failed to find a secret storage driver: %s" },
+    { VIR_ERR_INVALID_SECRET, "Invalid secret", "Invalid secret: %s" },
+    { VIR_ERR_NO_SECRET, "Secret not found", "Secret not found: %s" },
+    { VIR_ERR_CONFIG_UNSUPPORTED, "unsupported configuration", "unsupported configuration: %s" },
+    { VIR_ERR_OPERATION_TIMEOUT, "Timed out during operation", "Timed out during operation: %s" },
+    { VIR_ERR_MIGRATE_PERSIST_FAILED,
+        "Failed to make domain persistent after migration",
+        "Failed to make domain persistent after migration: %s" },
+    { VIR_ERR_HOOK_SCRIPT_FAILED,
+        "Hook script execution failed",
+        "Hook script execution failed: %s" },
+    { VIR_ERR_INVALID_DOMAIN_SNAPSHOT, "Invalid snapshot", "Invalid snapshot: %s" },
+    { VIR_ERR_NO_DOMAIN_SNAPSHOT, "Domain snapshot not found", "Domain snapshot not found: %s" },
+    { VIR_ERR_INVALID_STREAM, "invalid stream pointer", "invalid stream pointer in %s" },
+    { VIR_ERR_ARGUMENT_UNSUPPORTED, "argument unsupported", "argument unsupported: %s" },
+    { VIR_ERR_STORAGE_PROBE_FAILED, "Storage pool probe failed", "Storage pool probe failed: %s" },
+    { VIR_ERR_STORAGE_POOL_BUILT, "Storage pool already built", "Storage pool already built: %s" },
+    { VIR_ERR_SNAPSHOT_REVERT_RISKY, "revert requires force", "revert requires force: %s" },
+    { VIR_ERR_OPERATION_ABORTED, "operation aborted", "operation aborted: %s" },
+    { VIR_ERR_AUTH_CANCELLED, "authentication cancelled", "authentication cancelled: %s" },
+    { VIR_ERR_NO_DOMAIN_METADATA, "metadata not found", "metadata not found: %s" },
+    { VIR_ERR_MIGRATE_UNSAFE, "Unsafe migration", "Unsafe migration: %s" },
+    { VIR_ERR_OVERFLOW, "numerical overflow", "numerical overflow: %s" },
+    { VIR_ERR_BLOCK_COPY_ACTIVE, "block copy still active", "block copy still active: %s" },
+    { VIR_ERR_OPERATION_UNSUPPORTED, "Operation not supported", "Operation not supported: %s" },
+    { VIR_ERR_SSH, "SSH transport error", "SSH transport error: %s" },
+    { VIR_ERR_AGENT_UNRESPONSIVE,
+        "Guest agent is not responding",
+        "Guest agent is not responding: %s" },
+    { VIR_ERR_RESOURCE_BUSY, "resource busy", "resource busy: %s" },
+    { VIR_ERR_ACCESS_DENIED, "access denied", "access denied: %s" },
+    { VIR_ERR_DBUS_SERVICE, "error from service", "error from service: %s" },
+    { VIR_ERR_STORAGE_VOL_EXIST,
+        "this storage volume exists already",
+        "storage volume %s exists already" },
+    { VIR_ERR_CPU_INCOMPATIBLE,
+        "the CPU is incompatible with host CPU",
+        "the CPU is incompatible with host CPU: %s" },
+    { VIR_ERR_XML_INVALID_SCHEMA,
+        "XML document failed to validate against schema",
+        "XML document failed to validate against schema: %s" },
+    { VIR_ERR_MIGRATE_FINISH_OK,
+        "migration successfully aborted",
+        "migration successfully aborted: %s" },
+    { VIR_ERR_AUTH_UNAVAILABLE, "authentication unavailable", "authentication unavailable: %s" },
+    { VIR_ERR_NO_SERVER, "Server not found", "Server not found: %s" },
+    { VIR_ERR_NO_CLIENT, "Client not found", "Client not found: %s" },
+    { VIR_ERR_AGENT_UNSYNCED,
+        "guest agent replied with wrong id to guest-sync command",
+        "guest agent replied with wrong id to guest-sync command: %s" },
+    { VIR_ERR_LIBSSH, "libssh transport error", "libssh transport error: %s" },
+    { VIR_ERR_DEVICE_MISSING, "device not found", "device not found: %s" },
+    { VIR_ERR_INVALID_NWFILTER_BINDING,
+        "Invalid network filter binding",
+        "Invalid network filter binding: %s" },
+    { VIR_ERR_NO_NWFILTER_BINDING,
+        "Network filter binding not found",
+        "Network filter binding not found: %s" },
+};
+
+
 /**
  * virErrorMsg:
  * @error: the virErrorNumber
@@ -918,622 +1090,16 @@ void virRaiseErrorObject(const char *filename,
 const char *
 virErrorMsg(virErrorNumber error, const char *info)
 {
-    const char *errmsg = NULL;
+    if (error >= VIR_ERR_NUMBER_LAST)
+        return NULL;

-    switch (error) {
-        case VIR_ERR_NUMBER_LAST:
-        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:
-            if (info == NULL)
-                errmsg = _("out of memory");
-            else
-                errmsg = _("out of memory: %s");
-            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:
-            if (info != NULL)
-                errmsg = _("got unknown HTTP error code %s");
-            else
-                errmsg = _("got unknown HTTP error code");
-            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:
-            if (info == NULL)
-                errmsg = _("failed Xen syscall");
-            else
-                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:
-            if (info == NULL)
-                errmsg = _("missing kernel information");
-            else
-                errmsg = _("missing kernel information: %s");
-            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 forbidden: %s");
-            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_AUTH_UNAVAILABLE:
-            if (info == NULL)
-                errmsg = _("authentication unavailable");
-            else
-                errmsg = _("authentication unavailable: %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_VOL_EXIST:
-            if (info == NULL)
-                errmsg = _("this storage volume exists already");
-            else
-                errmsg = _("storage volume %s exists already");
-            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;
-        case VIR_ERR_OPERATION_UNSUPPORTED:
-            if (!info)
-                errmsg = _("Operation not supported");
-            else
-                errmsg = _("Operation not supported: %s");
-            break;
-        case VIR_ERR_SSH:
-            if (info == NULL)
-                errmsg = _("SSH transport error");
-            else
-                errmsg = _("SSH transport error: %s");
-            break;
-        case VIR_ERR_AGENT_UNRESPONSIVE:
-            if (info == NULL)
-                errmsg = _("Guest agent is not responding");
-            else
-                errmsg = _("Guest agent is not responding: %s");
-            break;
-        case VIR_ERR_RESOURCE_BUSY:
-            if (info == NULL)
-                errmsg = _("resource busy");
-            else
-                errmsg = _("resource busy: %s");
-            break;
-        case VIR_ERR_ACCESS_DENIED:
-            if (info == NULL)
-                errmsg = _("access denied");
-            else
-                errmsg = _("access denied: %s");
-            break;
-        case VIR_ERR_DBUS_SERVICE:
-            if (info == NULL)
-                errmsg = _("error from service");
-            else
-                errmsg = _("error from service: %s");
-            break;
-        case VIR_ERR_CPU_INCOMPATIBLE:
-            if (info == NULL)
-                errmsg = _("the CPU is incompatible with host CPU");
-            else
-                errmsg = _("the CPU is incompatible with host CPU: %s");
-            break;
-        case VIR_ERR_XML_INVALID_SCHEMA:
-            if (info == NULL)
-                errmsg = _("XML document failed to validate against schema");
-            else
-                errmsg = _("XML document failed to validate against schema: %s");
-            break;
-        case VIR_ERR_MIGRATE_FINISH_OK:
-            if (info == NULL)
-                errmsg = _("migration successfully aborted");
-            else
-                errmsg = _("migration successfully aborted: %s");
-            break;
-        case VIR_ERR_NO_SERVER:
-            if (info == NULL)
-                errmsg = _("Server not found");
-            else
-                errmsg = _("Server not found: %s");
-            break;
-        case VIR_ERR_NO_CLIENT:
-            if (info == NULL)
-                errmsg = _("Client not found");
-            else
-                errmsg = _("Client not found: %s");
-            break;
-        case VIR_ERR_AGENT_UNSYNCED: /* DEPRECATED */
-            if (info == NULL)
-                errmsg = _("guest agent replied with wrong id to guest-sync command");
-            else
-                errmsg = _("guest agent replied with wrong id to guest-sync command: %s");
-            break;
-        case VIR_ERR_LIBSSH:
-            if (info == NULL)
-                errmsg = _("libssh transport error");
-            else
-                errmsg = _("libssh transport error: %s");
-            break;
-        case VIR_ERR_DEVICE_MISSING:
-            if (info == NULL)
-                errmsg = _("device not found");
-            else
-                errmsg = _("device not found: %s");
-            break;
-        case VIR_ERR_INVALID_NWFILTER_BINDING:
-            if (info == NULL)
-                errmsg = _("Invalid network filter binding");
-            else
-                errmsg = _("Invalid network filter binding: %s");
-            break;
-        case VIR_ERR_NO_NWFILTER_BINDING:
-            if (info == NULL)
-                errmsg = _("Network filter binding not found");
-            else
-                errmsg = _("Network filter binding not found: %s");
-            break;
-    }
-    return errmsg;
+    if (info)
+        return virErrorMsgStrings[error].msginfo;
+    else
+        return virErrorMsgStrings[error].msg;
 }

+
 /**
  * virReportErrorHelper:
  *
diff --git a/src/util/virerrorpriv.h b/src/util/virerrorpriv.h
index bc214393e6..1be40d8a51 100644
--- a/src/util/virerrorpriv.h
+++ b/src/util/virerrorpriv.h
@@ -21,6 +21,14 @@
 #ifndef __VIR_ERROR_PRIV_H__
 # define __VIR_ERROR_PRIV_H__

+typedef struct {
+    virErrorNumber error;
+    const char *msg;
+    const char *msginfo;
+} virErrorMsgTuple;
+
+extern const virErrorMsgTuple virErrorMsgStrings[VIR_ERR_NUMBER_LAST];
+
 const char *
 virErrorMsg(virErrorNumber error,
             const char *info);
-- 
2.19.2




More information about the libvir-list mailing list