[libvirt] [PATCH] Santize the reporting of VIR_ERR_INVALID_ERROR

Daniel P. Berrange berrange at redhat.com
Fri May 25 17:44:11 UTC 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

To ensure consistent error reporting of invalid arguments,
provide a number of predefined helper methods & macros.

 - An arg which must not be NULL:

   virCheckNonNullArgReturn(argname, retvalue)
   virCheckNonNullArgGoto(argname, label)

 - An arg which must be NULL

   virCheckNullArgGoto(argname, label)

 - An arg which must be positive (ie 1 or greater)

   virCheckPositiveArgGoto(argname, label)

 - An arg which must not be 0

   virCheckNonZeroArgGoto(argname, label)

 - An arg which must be zero

   virCheckZeroArgGoto(argname, label)

 - An arg which must not be negative (ie 0 or greater)

   virCheckNonNegativeArgGoto(argname, label)

TBD: many more source files to fixup
---
 src/datatypes.c               |  119 ++---
 src/internal.h                |   61 ++-
 src/libvirt-qemu.c            |   14 +-
 src/libvirt.c                 | 1160 +++++++++++++++--------------------------
 src/nodeinfo.c                |   19 +-
 src/util/virterror_internal.h |   77 +++
 6 files changed, 616 insertions(+), 834 deletions(-)

diff --git a/src/datatypes.c b/src/datatypes.c
index 0857f9a..d718170 100644
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -138,7 +138,7 @@ virUnrefConnect(virConnectPtr conn) {
     int refs;
 
     if ((!VIR_IS_CONNECT(conn))) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
+        virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
         return -1;
     }
     virMutexLock(&conn->lock);
@@ -173,17 +173,12 @@ virGetDomain(virConnectPtr conn, const char *name, const unsigned char *uuid) {
     char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if (!VIR_IS_CONNECT(conn)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
-        return NULL;
-    }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
-        return NULL;
-    }
-    if (uuid == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing uuid"));
+        virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
         return NULL;
     }
+    virCheckNonNullArgReturn(name, NULL);
+    virCheckNonNullArgReturn(uuid, NULL);
+
     virMutexLock(&conn->lock);
 
     virUUIDFormat(uuid, uuidstr);
@@ -269,7 +264,7 @@ virUnrefDomain(virDomainPtr domain) {
     int refs;
 
     if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("bad domain or no connection"));
+        virLibConnError(VIR_ERR_INVALID_DOMAIN, _("bad domain or no connection"));
         return -1;
     }
     virMutexLock(&domain->conn->lock);
@@ -305,17 +300,12 @@ virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid) {
     char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if (!VIR_IS_CONNECT(conn)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
-        return NULL;
-    }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
-        return NULL;
-    }
-    if (uuid == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing uuid"));
+        virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
         return NULL;
     }
+    virCheckNonNullArgReturn(name, NULL);
+    virCheckNonNullArgReturn(uuid, NULL);
+
     virMutexLock(&conn->lock);
 
     virUUIDFormat(uuid, uuidstr);
@@ -399,7 +389,7 @@ virUnrefNetwork(virNetworkPtr network) {
     int refs;
 
     if (!VIR_IS_CONNECTED_NETWORK(network)) {
-        virLibConnError(VIR_ERR_INVALID_ARG,
+        virLibConnError(VIR_ERR_INVALID_NETWORK,
                         _("bad network or no connection"));
         return -1;
     }
@@ -437,13 +427,10 @@ virGetInterface(virConnectPtr conn, const char *name, const char *mac) {
     virInterfacePtr ret = NULL;
 
     if (!VIR_IS_CONNECT(conn)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
-        return NULL;
-    }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
+        virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
         return NULL;
     }
+    virCheckNonNullArgReturn(name, NULL);
 
     /* a NULL mac from caller is okay. Treat it as blank */
     if (mac == NULL)
@@ -535,7 +522,7 @@ virUnrefInterface(virInterfacePtr iface) {
     int refs;
 
     if (!VIR_IS_CONNECTED_INTERFACE(iface)) {
-        virLibConnError(VIR_ERR_INVALID_ARG,
+        virLibConnError(VIR_ERR_INVALID_INTERFACE,
                         _("bad interface or no connection"));
         return -1;
     }
@@ -574,17 +561,12 @@ virGetStoragePool(virConnectPtr conn, const char *name,
     char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if (!VIR_IS_CONNECT(conn)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
-        return NULL;
-    }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
-        return NULL;
-    }
-    if (uuid == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing uuid"));
+        virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
         return NULL;
     }
+    virCheckNonNullArgReturn(name, NULL);
+    virCheckNonNullArgReturn(uuid, NULL);
+
     virMutexLock(&conn->lock);
 
     virUUIDFormat(uuid, uuidstr);
@@ -669,7 +651,7 @@ virUnrefStoragePool(virStoragePoolPtr pool) {
     int refs;
 
     if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
-        virLibConnError(VIR_ERR_INVALID_ARG,
+        virLibConnError(VIR_ERR_INVALID_STORAGE_POOL,
                         _("bad storage pool or no connection"));
         return -1;
     }
@@ -708,17 +690,12 @@ virGetStorageVol(virConnectPtr conn, const char *pool, const char *name,
     virStorageVolPtr ret = NULL;
 
     if (!VIR_IS_CONNECT(conn)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
-        return NULL;
-    }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
-        return NULL;
-    }
-    if (key == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing key"));
+        virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
         return NULL;
     }
+    virCheckNonNullArgReturn(name, NULL);
+    virCheckNonNullArgReturn(key, NULL);
+
     virMutexLock(&conn->lock);
 
     if (VIR_ALLOC(ret) < 0) {
@@ -813,7 +790,7 @@ virUnrefStorageVol(virStorageVolPtr vol) {
     int refs;
 
     if (!VIR_IS_CONNECTED_STORAGE_VOL(vol)) {
-        virLibConnError(VIR_ERR_INVALID_ARG,
+        virLibConnError(VIR_ERR_INVALID_STORAGE_VOL,
                         _("bad storage volume or no connection"));
         return -1;
     }
@@ -850,13 +827,11 @@ virGetNodeDevice(virConnectPtr conn, const char *name)
     virNodeDevicePtr ret = NULL;
 
     if (!VIR_IS_CONNECT(conn)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
-        return NULL;
-    }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
+        virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
         return NULL;
     }
+    virCheckNonNullArgReturn(name, NULL);
+
     virMutexLock(&conn->lock);
 
     if (VIR_ALLOC(ret) < 0) {
@@ -970,17 +945,12 @@ virGetSecret(virConnectPtr conn, const unsigned char *uuid,
     char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if (!VIR_IS_CONNECT(conn)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
-        return NULL;
-    }
-    if (uuid == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing uuid"));
-        return NULL;
-    }
-    if (usageID == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing usageID"));
+        virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
         return NULL;
     }
+    virCheckNonNullArgReturn(uuid, NULL);
+    virCheckNonNullArgReturn(usageID, NULL);
+
     virMutexLock(&conn->lock);
 
     virUUIDFormat(uuid, uuidstr);
@@ -1061,7 +1031,7 @@ virUnrefSecret(virSecretPtr secret) {
     int refs;
 
     if (!VIR_IS_CONNECTED_SECRET(secret)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("bad secret or no connection"));
+        virLibConnError(VIR_ERR_INVALID_SECRET, _("bad secret or no connection"));
         return -1;
     }
     virMutexLock(&secret->conn->lock);
@@ -1156,17 +1126,12 @@ virGetNWFilter(virConnectPtr conn, const char *name, const unsigned char *uuid)
     char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if (!VIR_IS_CONNECT(conn)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("no connection"));
-        return NULL;
-    }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
-        return NULL;
-    }
-    if (uuid == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing uuid"));
+        virLibConnError(VIR_ERR_INVALID_CONN, _("no connection"));
         return NULL;
     }
+    virCheckNonNullArgReturn(name, NULL);
+    virCheckNonNullArgReturn(uuid, NULL);
+
     virMutexLock(&conn->lock);
 
     virUUIDFormat(uuid, uuidstr);
@@ -1253,7 +1218,7 @@ virUnrefNWFilter(virNWFilterPtr nwfilter)
     int refs;
 
     if (!VIR_IS_CONNECTED_NWFILTER(nwfilter)) {
-        virLibConnError(VIR_ERR_INVALID_ARG,
+        virLibConnError(VIR_ERR_INVALID_NWFILTER,
                         _("bad nwfilter or no connection"));
         return -1;
     }
@@ -1279,13 +1244,11 @@ virGetDomainSnapshot(virDomainPtr domain, const char *name)
     virDomainSnapshotPtr ret = NULL;
 
     if (!VIR_IS_DOMAIN(domain)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("bad domain"));
-        return NULL;
-    }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("missing name"));
+        virLibConnError(VIR_ERR_INVALID_DOMAIN, _("bad domain"));
         return NULL;
     }
+    virCheckNonNullArgReturn(name, NULL);
+
     virMutexLock(&domain->conn->lock);
 
     if (VIR_ALLOC(ret) < 0) {
@@ -1344,7 +1307,7 @@ virUnrefDomainSnapshot(virDomainSnapshotPtr snapshot)
     int refs;
 
     if (!VIR_IS_DOMAIN_SNAPSHOT(snapshot)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, _("not a snapshot"));
+        virLibConnError(VIR_ERR_INVALID_DOMAIN_SNAPSHOT, _("not a snapshot"));
         return -1;
     }
 
diff --git a/src/internal.h b/src/internal.h
index d13847a..825b0fe 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -232,17 +232,64 @@
     do {                                                                \
         unsigned long __unsuppflags = flags & ~(supported);             \
         if (__unsuppflags) {                                            \
-            virReportErrorHelper(VIR_FROM_THIS,                         \
-                                 VIR_ERR_INVALID_ARG,                   \
-                                 __FILE__,                              \
-                                 __FUNCTION__,                          \
-                                 __LINE__,                              \
-                                 _("%s: unsupported flags (0x%lx)"),    \
-                                 __FUNCTION__, __unsuppflags);          \
+            virReportInvalidArg("flags",                                \
+                                _("unsupported flags (0x%lx) in function %s"), \
+                                __unsuppflags, __FUNCTION__);           \
             return retval;                                              \
         }                                                               \
     } while (0)
 
+# define virCheckNonNullArgReturn(argname, retval)  \
+    do {                                            \
+        if (argname == NULL) {                      \
+            virReportInvalidNullArg(#argname);      \
+            return retval;                          \
+        }                                           \
+    } while (0)
+# define virCheckNullArgGoto(argname, label)        \
+    do {                                            \
+        if (argname == NULL) {                      \
+            virReportInvalidNullArg(#argname);      \
+            goto label;                             \
+        }                                           \
+    } while (0)
+# define virCheckNonNullArgGoto(argname, label)     \
+    do {                                            \
+        if (argname == NULL) {                      \
+            virReportInvalidNonNullArg(#argname);   \
+            goto label;                             \
+        }                                           \
+    } while (0)
+# define virCheckPositiveArgGoto(argname, label)    \
+    do {                                            \
+        if (argname <= 0) {                         \
+            virReportInvalidPositiveArg(#argname);  \
+            goto label;                             \
+        }                                           \
+    } while (0)
+# define virCheckNonZeroArgGoto(argname, label)     \
+    do {                                            \
+        if (argname == 0) {                         \
+            virReportInvalidNonZeroArg(#argname);   \
+            goto label;                             \
+        }                                           \
+    } while (0)
+# define virCheckZeroArgGoto(argname, label)        \
+    do {                                            \
+        if (argname != 0) {                         \
+            virReportInvalidNonZeroArg(#argname);   \
+            goto label;                             \
+        }                                           \
+    } while (0)
+# define virCheckNonNegativeArgGoto(argname, label) \
+    do {                                            \
+        if (argname < 0) {                          \
+            virReportInvalidNonNegativeArg(#argname);   \
+            goto label;                             \
+        }                                           \
+    } while (0)
+
+
 /* divide value by size, rounding up */
 # define VIR_DIV_UP(value, size) (((value) + (size) - 1) / (size))
 
diff --git a/src/libvirt-qemu.c b/src/libvirt-qemu.c
index 5267bba..4b2f8c2 100644
--- a/src/libvirt-qemu.c
+++ b/src/libvirt-qemu.c
@@ -28,6 +28,8 @@
 #include "datatypes.h"
 #include "libvirt/libvirt-qemu.h"
 
+#define VIR_FROM_THIS VIR_FROM_NONE
+
 #define virLibConnError(conn, error, info)                               \
     virReportErrorHelper(VIR_FROM_NONE, error, NULL, __FUNCTION__,       \
                          __LINE__, info)
@@ -87,10 +89,7 @@ virDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
 
     conn = domain->conn;
 
-    if (result == NULL) {
-        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(result, error);
 
     if (conn->flags & VIR_CONNECT_RO) {
         virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@@ -159,8 +158,11 @@ virDomainQemuAttach(virConnectPtr conn,
         return NULL;
     }
 
-    if (pid != pid_value || pid <= 1) {
-        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
+    virCheckPositiveArgGoto(pid_value, error);
+    if (pid != pid_value) {
+        virReportInvalidArg(pid_value,
+                            _("pid_value in %s is too large"),
+                            __FUNCTION__);
         goto error;
     }
 
diff --git a/src/libvirt.c b/src/libvirt.c
index 8900011..542660c 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -533,10 +533,7 @@ virRegisterNetworkDriver(virNetworkDriverPtr driver)
     if (virInitialize() < 0)
       return -1;
 
-    if (driver == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        return -1;
-    }
+    virCheckNonNullArgReturn(driver, -1);
 
     if (virNetworkDriverTabCount >= MAX_DRIVERS) {
         virLibConnError(VIR_ERR_INTERNAL_ERROR,
@@ -566,10 +563,7 @@ virRegisterInterfaceDriver(virInterfaceDriverPtr driver)
     if (virInitialize() < 0)
       return -1;
 
-    if (driver == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        return -1;
-    }
+    virCheckNonNullArgReturn(driver, -1);
 
     if (virInterfaceDriverTabCount >= MAX_DRIVERS) {
         virLibConnError(VIR_ERR_INTERNAL_ERROR,
@@ -599,10 +593,7 @@ virRegisterStorageDriver(virStorageDriverPtr driver)
     if (virInitialize() < 0)
       return -1;
 
-    if (driver == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        return -1;
-    }
+    virCheckNonNullArgReturn(driver, -1);
 
     if (virStorageDriverTabCount >= MAX_DRIVERS) {
         virLibConnError(VIR_ERR_INTERNAL_ERROR,
@@ -632,10 +623,7 @@ virRegisterDeviceMonitor(virDeviceMonitorPtr driver)
     if (virInitialize() < 0)
       return -1;
 
-    if (driver == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        return -1;
-    }
+    virCheckNonNullArgReturn(driver, -1);
 
     if (virDeviceMonitorTabCount >= MAX_DRIVERS) {
         virLibConnError(VIR_ERR_INTERNAL_ERROR,
@@ -665,10 +653,7 @@ virRegisterSecretDriver(virSecretDriverPtr driver)
     if (virInitialize() < 0)
       return -1;
 
-    if (driver == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        return -1;
-    }
+    virCheckNonNullArgReturn(driver, -1);
 
     if (virSecretDriverTabCount >= MAX_DRIVERS) {
         virLibConnError(VIR_ERR_INTERNAL_ERROR,
@@ -698,10 +683,7 @@ virRegisterNWFilterDriver(virNWFilterDriverPtr driver)
     if (virInitialize() < 0)
       return -1;
 
-    if (driver == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        return -1;
-    }
+    virCheckNonNullArgReturn(driver, -1);
 
     if (virNWFilterDriverTabCount >= MAX_DRIVERS) {
         virLibConnError(VIR_ERR_INTERNAL_ERROR,
@@ -734,10 +716,7 @@ virRegisterDriver(virDriverPtr driver)
     if (virInitialize() < 0)
         return -1;
 
-    if (driver == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        return -1;
-    }
+    virCheckNonNullArgReturn(driver, -1);
 
     if (virDriverTabCount >= MAX_DRIVERS) {
         virLibConnError(VIR_ERR_INTERNAL_ERROR,
@@ -746,12 +725,6 @@ virRegisterDriver(virDriverPtr driver)
         return -1;
     }
 
-    if (driver->no < 0) {
-        virLibConnError(VIR_ERR_INVALID_ARG,
-                        _("Tried to register an internal Xen driver"));
-        return -1;
-    }
-
     VIR_DEBUG ("registering %s as driver %d",
            driver->name, virDriverTabCount);
 
@@ -774,10 +747,7 @@ virRegisterStateDriver(virStateDriverPtr driver)
     if (virInitialize() < 0)
       return -1;
 
-    if (driver == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        return -1;
-    }
+    virCheckNonNullArgReturn(driver, -1);
 
     if (virStateDriverTabCount >= MAX_DRIVERS) {
         virLibConnError(VIR_ERR_INTERNAL_ERROR,
@@ -1172,7 +1142,7 @@ do_open (const char *name,
              STRCASEEQ(ret->uri->scheme, "xenapi") ||
 #endif
              false)) {
-            virReportErrorHelper(VIR_FROM_NONE, VIR_ERR_INVALID_ARG,
+            virReportErrorHelper(VIR_FROM_NONE, VIR_ERR_CONFIG_UNSUPPORTED,
                                  __FILE__, __FUNCTION__, __LINE__,
                                  _("libvirt was built without the '%s' driver"),
                                  ret->uri->scheme);
@@ -1588,10 +1558,7 @@ virConnectGetVersion(virConnectPtr conn, unsigned long *hvVer)
         return -1;
     }
 
-    if (hvVer == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(hvVer, error);
 
     if (conn->driver->version) {
         int ret = conn->driver->version (conn, hvVer);
@@ -1632,10 +1599,7 @@ virConnectGetLibVersion(virConnectPtr conn, unsigned long *libVer)
         return -1;
     }
 
-    if (libVer == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(libVer, error);
 
     if (conn->driver->libvirtVersion) {
         ret = conn->driver->libvirtVersion(conn, libVer);
@@ -1831,10 +1795,8 @@ virConnectListDomains(virConnectPtr conn, int *ids, int maxids)
         return -1;
     }
 
-    if ((ids == NULL) || (maxids < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(ids, error);
+    virCheckNonNegativeArgGoto(maxids, error);
 
     if (conn->driver->listDomains) {
         int ret = conn->driver->listDomains (conn, ids, maxids);
@@ -1951,10 +1913,7 @@ virDomainCreateXML(virConnectPtr conn, const char *xmlDesc,
         virDispatchError(NULL);
         return NULL;
     }
-    if (xmlDesc == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xmlDesc, error);
     if (conn->flags & VIR_CONNECT_RO) {
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
@@ -2017,10 +1976,7 @@ virDomainLookupByID(virConnectPtr conn, int id)
         virDispatchError(NULL);
         return NULL;
     }
-    if (id < 0) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNegativeArgGoto(id, error);
 
     if (conn->driver->domainLookupByID) {
         virDomainPtr ret;
@@ -2059,10 +2015,7 @@ virDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
         virDispatchError(NULL);
         return NULL;
     }
-    if (uuid == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuid, error);
 
     if (conn->driver->domainLookupByUUID) {
         virDomainPtr ret;
@@ -2102,13 +2055,12 @@ virDomainLookupByUUIDString(virConnectPtr conn, const char *uuidstr)
         virDispatchError(NULL);
         return NULL;
     }
-    if (uuidstr == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuidstr, error);
 
     if (virUUIDParse(uuidstr, uuid) < 0) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(uuidstr,
+                            _("uuidstr in %s must be a valid UUID"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -2141,10 +2093,7 @@ virDomainLookupByName(virConnectPtr conn, const char *name)
         virDispatchError(NULL);
         return NULL;
     }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(name, error);
 
     if (conn->driver->domainLookupByName) {
         virDomainPtr dom;
@@ -2336,7 +2285,7 @@ int
 virDomainRef(virDomainPtr domain)
 {
     if ((!VIR_IS_CONNECTED_DOMAIN(domain))) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virLibConnError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
         virDispatchError(NULL);
         return -1;
     }
@@ -2588,10 +2537,7 @@ virDomainSave(virDomainPtr domain, const char *to)
         goto error;
     }
     conn = domain->conn;
-    if (to == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(to, error);
 
     if (conn->driver->domainSave) {
         int ret;
@@ -2680,14 +2626,11 @@ virDomainSaveFlags(virDomainPtr domain, const char *to,
         goto error;
     }
     conn = domain->conn;
-    if (to == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(to, error);
 
     if ((flags & VIR_DOMAIN_SAVE_RUNNING) && (flags & VIR_DOMAIN_SAVE_PAUSED)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("running and paused flags are mutually exclusive"));
+        virReportInvalidArg(flags, "%s",
+                            _("running and paused flags are mutually exclusive"));
         goto error;
     }
 
@@ -2745,10 +2688,7 @@ virDomainRestore(virConnectPtr conn, const char *from)
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (from == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(from, error);
 
     if (conn->driver->domainRestore) {
         int ret;
@@ -2824,14 +2764,11 @@ virDomainRestoreFlags(virConnectPtr conn, const char *from, const char *dxml,
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (from == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(from, error);
 
     if ((flags & VIR_DOMAIN_SAVE_RUNNING) && (flags & VIR_DOMAIN_SAVE_PAUSED)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("running and paused flags are mutually exclusive"));
+        virReportInvalidArg(flags, "%s",
+                            _("running and paused flags are mutually exclusive"));
         goto error;
     }
 
@@ -2895,10 +2832,7 @@ virDomainSaveImageGetXMLDesc(virConnectPtr conn, const char *file,
         virDispatchError(NULL);
         return NULL;
     }
-    if (file == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(file, error);
 
     if ((conn->flags & VIR_CONNECT_RO) && (flags & VIR_DOMAIN_XML_SECURE)) {
         virLibConnError(VIR_ERR_OPERATION_DENIED,
@@ -2978,14 +2912,12 @@ virDomainSaveImageDefineXML(virConnectPtr conn, const char *file,
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (!file || !dxml) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(file, error);
+    virCheckNonNullArgGoto(dxml, error);
 
     if ((flags & VIR_DOMAIN_SAVE_RUNNING) && (flags & VIR_DOMAIN_SAVE_PAUSED)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("running and paused flags are mutually exclusive"));
+        virReportInvalidArg(flags, "%s",
+                            _("running and paused flags are mutually exclusive"));
         goto error;
     }
 
@@ -3061,26 +2993,23 @@ virDomainCoreDump(virDomainPtr domain, const char *to, unsigned int flags)
         goto error;
     }
     conn = domain->conn;
-    if (to == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(to, error);
 
     if ((flags & VIR_DUMP_CRASH) && (flags & VIR_DUMP_LIVE)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("crash and live flags are mutually exclusive"));
+        virReportInvalidArg(flags, "%s",
+                            _("crash and live flags are mutually exclusive"));
         goto error;
     }
 
     if ((flags & VIR_DUMP_CRASH) && (flags & VIR_DUMP_RESET)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
+        virReportInvalidArg(flags, "%s",
                          _("crash and reset flags are mutually exclusive"));
         goto error;
     }
 
     if ((flags & VIR_DUMP_LIVE) && (flags & VIR_DUMP_RESET)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("live and reset flags are mutually exclusive"));
+        virReportInvalidArg(flags, "%s",
+                            _("live and reset flags are mutually exclusive"));
         goto error;
     }
 
@@ -3275,7 +3204,8 @@ virDomainShutdownFlags(virDomainPtr domain, unsigned int flags)
     /* At most one of these two flags should be set.  */
     if ((flags & VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN) &&
         (flags & VIR_DOMAIN_SHUTDOWN_GUEST_AGENT)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(flags, "%s",
+                            _("flags for acpi power button and guest agent are mutually exclusive"));
         goto error;
     }
 
@@ -3336,7 +3266,8 @@ virDomainReboot(virDomainPtr domain, unsigned int flags)
     /* At most one of these two flags should be set.  */
     if ((flags & VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN) &&
         (flags & VIR_DOMAIN_SHUTDOWN_GUEST_AGENT)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(flags, "%s",
+                            _("flags for acpi power button and guest agent are mutually exclusive"));
         goto error;
     }
 
@@ -3452,11 +3383,7 @@ virDomainGetUUID(virDomainPtr domain, unsigned char *uuid)
         virDispatchError(NULL);
         return -1;
     }
-    if (uuid == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        virDispatchError(domain->conn);
-        return -1;
-    }
+    virCheckNonNullArgReturn(uuid, -1);
 
     memcpy(uuid, &domain->uuid[0], VIR_UUID_BUFLEN);
 
@@ -3487,10 +3414,7 @@ virDomainGetUUIDString(virDomainPtr domain, char *buf)
         virDispatchError(NULL);
         return -1;
     }
-    if (buf == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(buf, error);
 
     if (virDomainGetUUID(domain, &uuid[0]))
         goto error;
@@ -3649,10 +3573,8 @@ virDomainSetMaxMemory(virDomainPtr domain, unsigned long memory)
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (!memory) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonZeroArgGoto(memory, error);
+
     conn = domain->conn;
 
     if (conn->driver->domainSetMaxMemory) {
@@ -3703,10 +3625,7 @@ virDomainSetMemory(virDomainPtr domain, unsigned long memory)
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (!memory) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonZeroArgGoto(memory, error);
 
     conn = domain->conn;
 
@@ -3771,11 +3690,7 @@ virDomainSetMemoryFlags(virDomainPtr domain, unsigned long memory,
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-
-    if (!memory) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonZeroArgGoto(memory, error);
 
     conn = domain->conn;
 
@@ -3810,27 +3725,24 @@ virTypedParameterValidateSet(virDomainPtr domain,
     for (i = 0; i < nparams; i++) {
         if (strnlen(params[i].field, VIR_TYPED_PARAM_FIELD_LENGTH) ==
             VIR_TYPED_PARAM_FIELD_LENGTH) {
-            virLibDomainError(VIR_ERR_INVALID_ARG,
-                              _("string parameter name '%.*s' too long"),
-                              VIR_TYPED_PARAM_FIELD_LENGTH,
-                              params[i].field);
-            virDispatchError(NULL);
+            virReportInvalidArg(params,
+                                _("string parameter name '%.*s' too long"),
+                                VIR_TYPED_PARAM_FIELD_LENGTH,
+                                params[i].field);
             return -1;
         }
         if (params[i].type == VIR_TYPED_PARAM_STRING) {
             if (string_okay) {
                 if (!params[i].value.s) {
-                    virLibDomainError(VIR_ERR_INVALID_ARG,
-                                      _("NULL string parameter '%s'"),
-                                      params[i].field);
-                    virDispatchError(NULL);
+                    virReportInvalidArg(params,
+                                        _("NULL string parameter '%s'"),
+                                        params[i].field);
                     return -1;
                 }
             } else {
-                virLibDomainError(VIR_ERR_INVALID_ARG,
-                                  _("string parameter '%s' unsupported"),
-                                  params[i].field);
-                virDispatchError(NULL);
+                virReportInvalidArg(params,
+                                    _("string parameter '%s' unsupported"),
+                                    params[i].field);
                 return -1;
             }
         }
@@ -3872,12 +3784,11 @@ virDomainSetMemoryParameters(virDomainPtr domain,
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if ((nparams <= 0) || (params == NULL)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(params, error);
+    virCheckPositiveArgGoto(nparams, error);
+
     if (virTypedParameterValidateSet(domain, params, nparams) < 0)
-        return -1;
+        goto error;
 
     conn = domain->conn;
 
@@ -3948,11 +3859,11 @@ virDomainGetMemoryParameters(virDomainPtr domain,
         virDispatchError(NULL);
         return -1;
     }
-    if ((nparams == NULL) || (*nparams < 0) ||
-        (params == NULL && *nparams != 0)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(nparams, error);
+    virCheckNonNegativeArgGoto(*nparams, error);
+    if (*nparams != 0)
+        virCheckNonNullArgGoto(params, error);
+
     if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
                                  VIR_DRV_FEATURE_TYPED_PARAM_STRING))
         flags |= VIR_TYPED_PARAM_STRING_OKAY;
@@ -3960,7 +3871,9 @@ virDomainGetMemoryParameters(virDomainPtr domain,
     /* At most one of these two flags should be set.  */
     if ((flags & VIR_DOMAIN_AFFECT_LIVE) &&
         (flags & VIR_DOMAIN_AFFECT_CONFIG)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(flags,
+                            _("flags 'affect live' and 'affect config' in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
     conn = domain->conn;
@@ -4013,12 +3926,10 @@ virDomainSetNumaParameters(virDomainPtr domain,
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if ((nparams <= 0) || (params == NULL)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(params, error);
+    virCheckPositiveArgGoto(nparams, error);
     if (virTypedParameterValidateSet(domain, params, nparams) < 0)
-        return -1;
+        goto error;
 
     conn = domain->conn;
 
@@ -4082,11 +3993,11 @@ virDomainGetNumaParameters(virDomainPtr domain,
         virDispatchError(NULL);
         return -1;
     }
-    if ((nparams == NULL) || (*nparams < 0) ||
-        (params == NULL && *nparams != 0)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(nparams, error);
+    virCheckNonNegativeArgGoto(*nparams, error);
+    if (*nparams != 0)
+        virCheckNonNullArgGoto(params, error);
+
     if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
                                  VIR_DRV_FEATURE_TYPED_PARAM_STRING))
         flags |= VIR_TYPED_PARAM_STRING_OKAY;
@@ -4142,12 +4053,11 @@ virDomainSetBlkioParameters(virDomainPtr domain,
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if ((nparams <= 0) || (params == NULL)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(params, error);
+    virCheckNonNegativeArgGoto(nparams, error);
+
     if (virTypedParameterValidateSet(domain, params, nparams) < 0)
-        return -1;
+        goto error;
 
     conn = domain->conn;
 
@@ -4209,11 +4119,11 @@ virDomainGetBlkioParameters(virDomainPtr domain,
         virDispatchError(NULL);
         return -1;
     }
-    if ((nparams == NULL) || (*nparams < 0) ||
-        (params == NULL && *nparams != 0)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(nparams, error);
+    virCheckNonNegativeArgGoto(*nparams, error);
+    if (*nparams != 0)
+        virCheckNonNullArgGoto(params, error);
+
     if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
                                  VIR_DRV_FEATURE_TYPED_PARAM_STRING))
         flags |= VIR_TYPED_PARAM_STRING_OKAY;
@@ -4221,7 +4131,9 @@ virDomainGetBlkioParameters(virDomainPtr domain,
     /* At most one of these two flags should be set.  */
     if ((flags & VIR_DOMAIN_AFFECT_LIVE) &&
         (flags & VIR_DOMAIN_AFFECT_CONFIG)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(flags,
+                            _("flags 'affect live' and 'affect config' in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
     conn = domain->conn;
@@ -4265,10 +4177,7 @@ virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
         virDispatchError(NULL);
         return -1;
     }
-    if (info == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(info, error);
 
     memset(info, 0, sizeof(virDomainInfo));
 
@@ -4320,10 +4229,7 @@ virDomainGetState(virDomainPtr domain,
         virDispatchError(NULL);
         return -1;
     }
-    if (!state) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(state, error);
 
     conn = domain->conn;
     if (conn->driver->domainGetState) {
@@ -4368,10 +4274,7 @@ virDomainGetControlInfo(virDomainPtr domain,
         return -1;
     }
 
-    if (!info) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(info, error);
 
     conn = domain->conn;
     if (conn->driver->domainGetControlInfo) {
@@ -4478,10 +4381,8 @@ char *virConnectDomainXMLFromNative(virConnectPtr conn,
         return NULL;
     }
 
-    if (nativeFormat == NULL || nativeConfig == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(nativeFormat, error);
+    virCheckNonNullArgGoto(nativeConfig, error);
 
     if (conn->driver->domainXMLFromNative) {
         char *ret;
@@ -4535,10 +4436,8 @@ char *virConnectDomainXMLToNative(virConnectPtr conn,
         goto error;
     }
 
-    if (nativeFormat == NULL || domainXml == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(nativeFormat, error);
+    virCheckNonNullArgGoto(domainXml, error);
 
     if (conn->driver->domainXMLToNative) {
         char *ret;
@@ -5018,8 +4917,18 @@ virDomainMigratePeer2Peer (virDomainPtr domain,
         return -1;
     }
 
-    if (!tempuri->server || STRPREFIX(tempuri->server, "localhost")) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+    if (!tempuri->server) {
+        virReportInvalidArg(tempuri,
+                            _("server field in tempuri in %s must not be NULL"),
+                            __FUNCTION__);
+        virDispatchError(domain->conn);
+        virURIFree(tempuri);
+        return -1;
+    }
+    if (STRPREFIX(tempuri->server, "localhost")) {
+        virReportInvalidArg(tempuri,
+                            _("server field in tempuri in %s must not be 'localhost'"),
+                            __FUNCTION__);
         virDispatchError(domain->conn);
         virURIFree(tempuri);
         return -1;
@@ -5620,10 +5529,7 @@ virDomainMigrateToURI (virDomainPtr domain,
         goto error;
     }
 
-    if (duri == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(duri, error);
 
     if (flags & VIR_MIGRATE_PEER2PEER) {
         if (VIR_DRV_SUPPORTS_FEATURE (domain->conn->driver, domain->conn,
@@ -6068,7 +5974,9 @@ virDomainMigratePrepareTunnel(virConnectPtr conn,
     }
 
     if (conn != st->conn) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(conn,
+                            _("conn in %s must match stream connection"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -6234,7 +6142,9 @@ virDomainMigratePrepareTunnel3(virConnectPtr conn,
     }
 
     if (conn != st->conn) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(conn,
+                            _("conn in %s must match stream connection"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -6441,10 +6351,7 @@ virNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info)
         virDispatchError(NULL);
         return -1;
     }
-    if (info == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(info, error);
 
     if (conn->driver->nodeGetInfo) {
         int ret;
@@ -6570,9 +6477,12 @@ int virNodeGetCPUStats (virConnectPtr conn,
         return -1;
     }
 
-    if ((nparams == NULL) || (*nparams < 0) ||
-        ((cpuNum < 0) && (cpuNum != VIR_NODE_CPU_STATS_ALL_CPUS))) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+    virCheckNonNullArgGoto(nparams, error);
+    virCheckNonNegativeArgGoto(*nparams, error);
+    if (((cpuNum < 0) && (cpuNum != VIR_NODE_CPU_STATS_ALL_CPUS))) {
+        virReportInvalidArg(cpuNum,
+                            _("cpuNum in %s only accepts %d as a negative value"),
+                            __FUNCTION__, VIR_NODE_CPU_STATS_ALL_CPUS);
         goto error;
     }
 
@@ -6656,9 +6566,12 @@ int virNodeGetMemoryStats (virConnectPtr conn,
         return -1;
     }
 
-    if ((nparams == NULL) || (*nparams < 0) ||
-        ((cellNum < 0) && (cellNum != VIR_NODE_MEMORY_STATS_ALL_CELLS))) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+    virCheckNonNullArgGoto(nparams, error);
+    virCheckNonNegativeArgGoto(*nparams, error);
+    if (((cellNum < 0) && (cellNum != VIR_NODE_MEMORY_STATS_ALL_CELLS))) {
+        virReportInvalidArg(cpuNum,
+                            _("cellNum in %s only accepts %d as a negative value"),
+                            __FUNCTION__, VIR_NODE_MEMORY_STATS_ALL_CELLS);
         goto error;
     }
 
@@ -6852,10 +6765,9 @@ virDomainGetSchedulerParameters(virDomainPtr domain,
         return -1;
     }
 
-    if (params == NULL || nparams == NULL || *nparams <= 0) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(params, error);
+    virCheckNonNullArgGoto(nparams, error);
+    virCheckPositiveArgGoto(*nparams, error);
 
     conn = domain->conn;
 
@@ -6923,10 +6835,9 @@ virDomainGetSchedulerParametersFlags(virDomainPtr domain,
         return -1;
     }
 
-    if (params == NULL || nparams == NULL || *nparams <= 0) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(params, error);
+    virCheckNonNullArgGoto(nparams, error);
+    virCheckPositiveArgGoto(*nparams, error);
 
     if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
                                  VIR_DRV_FEATURE_TYPED_PARAM_STRING))
@@ -6935,7 +6846,9 @@ virDomainGetSchedulerParametersFlags(virDomainPtr domain,
     /* At most one of these two flags should be set.  */
     if ((flags & VIR_DOMAIN_AFFECT_LIVE) &&
         (flags & VIR_DOMAIN_AFFECT_CONFIG)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(flags,
+                            _("flags 'affect live' and 'affect config' in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
     conn = domain->conn;
@@ -6991,12 +6904,11 @@ virDomainSetSchedulerParameters(virDomainPtr domain,
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (params == NULL || nparams < 0) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(params, error);
+    virCheckNonNegativeArgGoto(nparams, error);
+
     if (virTypedParameterValidateSet(domain, params, nparams) < 0)
-        return -1;
+        goto error;
 
     conn = domain->conn;
 
@@ -7056,12 +6968,11 @@ virDomainSetSchedulerParametersFlags(virDomainPtr domain,
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (params == NULL || nparams < 0) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(params, error);
+    virCheckNonNegativeArgGoto(nparams, error);
+
     if (virTypedParameterValidateSet(domain, params, nparams) < 0)
-        return -1;
+        goto error;
 
     conn = domain->conn;
 
@@ -7126,8 +7037,12 @@ virDomainBlockStats(virDomainPtr dom, const char *disk,
         virDispatchError(NULL);
         return -1;
     }
-    if (!disk || !stats || size > sizeof(stats2)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+    virCheckNonNullArgGoto(disk, error);
+    virCheckNonNullArgGoto(stats, error);
+    if (size > sizeof(stats2)) {
+        virReportInvalidArg(size,
+                            _("size in %s must be less than %zu"),
+                            __FUNCTION__, sizeof(stats2));
         goto error;
     }
     conn = dom->conn;
@@ -7202,11 +7117,12 @@ int virDomainBlockStatsFlags(virDomainPtr dom,
         virDispatchError(NULL);
         return -1;
     }
-    if (!disk || (nparams == NULL) || (*nparams < 0) ||
-        (params == NULL && *nparams != 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(disk, error);
+    virCheckNonNullArgGoto(nparams, error);
+    virCheckNonNegativeArgGoto(*nparams, error);
+    if (*nparams != 0)
+        virCheckNonNullArgGoto(params, error);
+
     if (VIR_DRV_SUPPORTS_FEATURE(dom->conn->driver, dom->conn,
                                  VIR_DRV_FEATURE_TYPED_PARAM_STRING))
         flags |= VIR_TYPED_PARAM_STRING_OKAY;
@@ -7266,10 +7182,15 @@ virDomainInterfaceStats (virDomainPtr dom, const char *path,
         virDispatchError(NULL);
         return -1;
     }
-    if (!path || !stats || size > sizeof(stats2)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+    virCheckNonNullArgGoto(path, error);
+    virCheckNonNullArgGoto(stats, error);
+    if (size > sizeof(stats2)) {
+        virReportInvalidArg(size,
+                            _("size in %s must be less than %zu"),
+                            __FUNCTION__, sizeof(stats2));
         goto error;
     }
+
     conn = dom->conn;
 
     if (conn->driver->domainInterfaceStats) {
@@ -7328,12 +7249,11 @@ virDomainSetInterfaceParameters(virDomainPtr domain,
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if ((nparams <= 0) || (params == NULL)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(params, error);
+    virCheckPositiveArgGoto(nparams, error);
+
     if (virTypedParameterValidateSet(domain, params, nparams) < 0)
-        return -1;
+        goto error;
 
     conn = domain->conn;
 
@@ -7399,11 +7319,11 @@ virDomainGetInterfaceParameters(virDomainPtr domain,
         virDispatchError(NULL);
         return -1;
     }
-    if ((nparams == NULL) || (*nparams < 0) ||
-        (params == NULL && *nparams != 0)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(nparams, error);
+    virCheckNonNegativeArgGoto(*nparams, error);
+    if (*nparams != 0)
+        virCheckNonNullArgGoto(params, error);
+
     if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
                                  VIR_DRV_FEATURE_TYPED_PARAM_STRING))
         flags |= VIR_TYPED_PARAM_STRING_OKAY;
@@ -7565,18 +7485,11 @@ virDomainBlockPeek (virDomainPtr dom,
         goto error;
     }
 
-    if (!disk) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("disk is NULL"));
-        goto error;
-    }
+    virCheckNonNullArgGoto(disk, error);
 
     /* Allow size == 0 as an access test. */
-    if (size > 0 && !buffer) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                           _("buffer is NULL"));
-        goto error;
-    }
+    if (size > 0)
+        virCheckNonNullArgGoto(buffer, error);
 
     if (conn->driver->domainBlockPeek) {
         int ret;
@@ -7646,11 +7559,7 @@ virDomainBlockResize (virDomainPtr dom,
         goto error;
     }
 
-    if (!disk) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                           _("disk is NULL"));
-        goto error;
-    }
+    virCheckNonNullArgGoto(disk, error);
 
     if (conn->driver->domainBlockResize) {
         int ret;
@@ -7749,17 +7658,15 @@ virDomainMemoryPeek (virDomainPtr dom,
 
     /* Exactly one of these two flags must be set.  */
     if (!(flags & VIR_MEMORY_VIRTUAL) == !(flags & VIR_MEMORY_PHYSICAL)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                     _("flags parameter must include VIR_MEMORY_VIRTUAL or VIR_MEMORY_PHYSICAL"));
+        virReportInvalidArg(flags,
+                            _("flags in %s must include VIR_MEMORY_VIRTUAL or VIR_MEMORY_PHYSICAL"),
+                            __FUNCTION__);
         goto error;
     }
 
     /* Allow size == 0 as an access test. */
-    if (size > 0 && !buffer) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                           _("buffer is NULL but size is non-zero"));
-        goto error;
-    }
+    if (size > 0)
+        virCheckNonNullArgGoto(buffer, error);
 
     if (conn->driver->domainMemoryPeek) {
         int ret;
@@ -7811,10 +7718,8 @@ virDomainGetBlockInfo(virDomainPtr domain, const char *disk,
         virDispatchError(NULL);
         return -1;
     }
-    if (disk == NULL || info == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(disk, error);
+    virCheckNonNullArgGoto(info, error);
 
     memset(info, 0, sizeof(virDomainBlockInfo));
 
@@ -7874,10 +7779,7 @@ virDomainDefineXML(virConnectPtr conn, const char *xml) {
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (xml == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xml, error);
 
     if (conn->driver->domainDefineXML) {
         virDomainPtr ret;
@@ -8064,10 +7966,8 @@ virConnectListDefinedDomains(virConnectPtr conn, char **const names,
         return -1;
     }
 
-    if ((names == NULL) || (maxnames < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (conn->driver->listDefinedDomains) {
         int ret;
@@ -8222,10 +8122,7 @@ virDomainGetAutostart(virDomainPtr domain,
         virDispatchError(NULL);
         return -1;
     }
-    if (!autostart) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(autostart, error);
 
     conn = domain->conn;
 
@@ -8435,10 +8332,8 @@ virDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
         goto error;
     }
 
-    if (nvcpus < 1) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonZeroArgGoto(nvcpus, error);
+
     conn = domain->conn;
 
     if (conn->driver->domainSetVcpus) {
@@ -8507,11 +8402,8 @@ virDomainSetVcpusFlags(virDomainPtr domain, unsigned int nvcpus,
         goto error;
     }
 
-    /* Perform some argument validation common to all implementations.  */
-    if (nvcpus < 1) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonZeroArgGoto(nvcpus, error);
+
     if ((unsigned short) nvcpus != nvcpus) {
         virLibDomainError(VIR_ERR_OVERFLOW, _("input too large: %u"), nvcpus);
         goto error;
@@ -8576,7 +8468,9 @@ virDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
     /* At most one of these two flags should be set.  */
     if ((flags & VIR_DOMAIN_AFFECT_LIVE) &&
         (flags & VIR_DOMAIN_AFFECT_CONFIG)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(flags,
+                            _("flags 'affect live' and 'affect config' in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
     conn = domain->conn;
@@ -8638,9 +8532,12 @@ virDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
         goto error;
     }
 
-    if ((vcpu > 32000) || (cpumap == NULL) || (maplen < 1)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-       goto error;
+    virCheckNonNullArgGoto(cpumap, error);
+    virCheckPositiveArgGoto(maplen, error);
+
+    if ((unsigned short) vcpu != vcpu) {
+        virLibDomainError(VIR_ERR_OVERFLOW, _("input too large: %u"), vcpu);
+        goto error;
     }
 
     conn = domain->conn;
@@ -8715,8 +8612,11 @@ virDomainPinVcpuFlags(virDomainPtr domain, unsigned int vcpu,
         goto error;
     }
 
-    if ((vcpu > 32000) || (cpumap == NULL) || (maplen < 1)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+    virCheckNonNullArgGoto(cpumap, error);
+    virCheckPositiveArgGoto(maplen, error);
+
+    if ((unsigned short) vcpu != vcpu) {
+        virLibDomainError(VIR_ERR_OVERFLOW, _("input too large: %u"), vcpu);
         goto error;
     }
 
@@ -8779,10 +8679,10 @@ virDomainGetVcpuPinInfo(virDomainPtr domain, int ncpumaps,
         return -1;
     }
 
-    if (ncpumaps < 1 || !cpumaps || maplen <= 0) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(cpumaps, error);
+    virCheckPositiveArgGoto(ncpumaps, error);
+    virCheckPositiveArgGoto(maplen, error);
+
     if (INT_MULTIPLY_OVERFLOW(ncpumaps, maplen)) {
         virLibDomainError(VIR_ERR_OVERFLOW, _("input too large: %d * %d"),
                           ncpumaps, maplen);
@@ -8792,7 +8692,9 @@ virDomainGetVcpuPinInfo(virDomainPtr domain, int ncpumaps,
     /* At most one of these two flags should be set.  */
     if ((flags & VIR_DOMAIN_AFFECT_LIVE) &&
         (flags & VIR_DOMAIN_AFFECT_CONFIG)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(flags,
+                            _("flags 'affect live' and 'affect config' in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
     conn = domain->conn;
@@ -8855,17 +8757,16 @@ virDomainGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo,
         virDispatchError(NULL);
         return -1;
     }
-    if ((info == NULL) || (maxinfo < 1)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(info, error);
+    virCheckPositiveArgGoto(maxinfo, error);
 
     /* Ensure that domainGetVcpus (aka remoteDomainGetVcpus) does not
        try to memcpy anything into a NULL pointer.  */
-    if (!cpumaps ? maplen != 0 : maplen <= 0) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    if (cpumaps)
+        virCheckPositiveArgGoto(maplen, error);
+    else
+        virCheckZeroArgGoto(maplen, error);
+
     if (cpumaps && INT_MULTIPLY_OVERFLOW(maxinfo, maplen)) {
         virLibDomainError(VIR_ERR_OVERFLOW, _("input too large: %d * %d"),
                           maxinfo, maplen);
@@ -8958,10 +8859,7 @@ virDomainGetSecurityLabel(virDomainPtr domain, virSecurityLabelPtr seclabel)
         return -1;
     }
 
-    if (seclabel == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(seclabel, error);
 
     conn = domain->conn;
 
@@ -9040,22 +8938,19 @@ virDomainSetMetadata(virDomainPtr domain,
     switch (type) {
     case VIR_DOMAIN_METADATA_TITLE:
         if (metadata && strchr(metadata, '\n')) {
-                virLibDomainError(VIR_ERR_INVALID_ARG, "%s",
-                                  _("Domain title can't contain newlines"));
-                goto error;
+            virReportInvalidArg(metadata,
+                                _("metadata title in %s can't contain newlines"),
+                                __FUNCTION__);
+            goto error;
         }
         /* fallthrough */
     case VIR_DOMAIN_METADATA_DESCRIPTION:
-        if (uri || key) {
-            virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-            goto error;
-        }
+        virCheckNullArgGoto(uri, error);
+        virCheckNullArgGoto(key, error);
         break;
     case VIR_DOMAIN_METADATA_ELEMENT:
-        if (!uri || !key) {
-            virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-            goto error;
-        }
+        virCheckNonNullArgGoto(uri, error);
+        virCheckNonNullArgGoto(key, error);
         break;
     default:
         /* For future expansion */
@@ -9119,23 +9014,19 @@ virDomainGetMetadata(virDomainPtr domain,
 
     if ((flags & VIR_DOMAIN_AFFECT_LIVE) &&
         (flags & VIR_DOMAIN_AFFECT_CONFIG)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(flags,
+                            _("flags 'affect live' and 'affect config' in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
 
     switch (type) {
     case VIR_DOMAIN_METADATA_TITLE:
     case VIR_DOMAIN_METADATA_DESCRIPTION:
-        if (uri) {
-            virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-            goto error;
-        }
+        virCheckNullArgGoto(uri, error);
         break;
     case VIR_DOMAIN_METADATA_ELEMENT:
-        if (!uri) {
-            virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-            goto error;
-        }
+        virCheckNonNullArgGoto(uri, error);
         break;
     default:
         /* For future expansion */
@@ -9180,10 +9071,7 @@ virNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr secmodel)
         return -1;
     }
 
-    if (secmodel == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(secmodel, error);
 
     if (conn->driver->nodeGetSecurityModel) {
         int ret;
@@ -9229,10 +9117,7 @@ virDomainAttachDevice(virDomainPtr domain, const char *xml)
         return -1;
     }
 
-    if (xml == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xml, error);
 
     if (domain->conn->flags & VIR_CONNECT_RO) {
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@@ -9295,10 +9180,7 @@ virDomainAttachDeviceFlags(virDomainPtr domain,
         return -1;
     }
 
-    if (xml == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xml, error);
 
     if (domain->conn->flags & VIR_CONNECT_RO) {
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@@ -9346,10 +9228,7 @@ virDomainDetachDevice(virDomainPtr domain, const char *xml)
         return -1;
     }
 
-    if (xml == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xml, error);
 
     if (domain->conn->flags & VIR_CONNECT_RO) {
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@@ -9412,10 +9291,7 @@ virDomainDetachDeviceFlags(virDomainPtr domain,
         return -1;
     }
 
-    if (xml == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xml, error);
 
     if (domain->conn->flags & VIR_CONNECT_RO) {
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@@ -9478,10 +9354,7 @@ virDomainUpdateDeviceFlags(virDomainPtr domain,
         return -1;
     }
 
-    if (xml == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xml, error);
 
     if (domain->conn->flags & VIR_CONNECT_RO) {
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@@ -9537,10 +9410,9 @@ virNodeGetCellsFreeMemory(virConnectPtr conn, unsigned long long *freeMems,
         return -1;
     }
 
-    if ((freeMems == NULL) || (maxCells <= 0) || (startCell < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(freeMems, error);
+    virCheckPositiveArgGoto(maxCells, error);
+    virCheckNonNegativeArgGoto(startCell, error);
 
     if (conn->driver->nodeGetCellsFreeMemory) {
         int ret;
@@ -9645,10 +9517,8 @@ virConnectListNetworks(virConnectPtr conn, char **const names, int maxnames)
         return -1;
     }
 
-    if ((names == NULL) || (maxnames < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (conn->networkDriver && conn->networkDriver->listNetworks) {
         int ret;
@@ -9725,10 +9595,8 @@ virConnectListDefinedNetworks(virConnectPtr conn, char **const names,
         return -1;
     }
 
-    if ((names == NULL) || (maxnames < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (conn->networkDriver && conn->networkDriver->listDefinedNetworks) {
         int ret;
@@ -9768,10 +9636,7 @@ virNetworkLookupByName(virConnectPtr conn, const char *name)
         virDispatchError(NULL);
         return NULL;
     }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto  error;
-    }
+    virCheckNonNullArgGoto(name, error);
 
     if (conn->networkDriver && conn->networkDriver->networkLookupByName) {
         virNetworkPtr ret;
@@ -9810,10 +9675,8 @@ virNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
         virDispatchError(NULL);
         return NULL;
     }
-    if (uuid == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+
+    virCheckNonNullArgGoto(uuid, error);
 
     if (conn->networkDriver && conn->networkDriver->networkLookupByUUID){
         virNetworkPtr ret;
@@ -9853,13 +9716,13 @@ virNetworkLookupByUUIDString(virConnectPtr conn, const char *uuidstr)
         virDispatchError(NULL);
         return NULL;
     }
-    if (uuidstr == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+
+    virCheckNonNullArgGoto(uuidstr, error);
 
     if (virUUIDParse(uuidstr, uuid) < 0) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(uuidstr,
+                            _("uuidstr in %s must be a valid UUID"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -9892,10 +9755,8 @@ virNetworkCreateXML(virConnectPtr conn, const char *xmlDesc)
         virDispatchError(NULL);
         return NULL;
     }
-    if (xmlDesc == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xmlDesc, error);
+
     if (conn->flags & VIR_CONNECT_RO) {
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
@@ -9941,10 +9802,7 @@ virNetworkDefineXML(virConnectPtr conn, const char *xml)
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (xml == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xml, error);
 
     if (conn->networkDriver && conn->networkDriver->networkDefineXML) {
         virNetworkPtr ret;
@@ -10196,10 +10054,7 @@ virNetworkGetUUID(virNetworkPtr network, unsigned char *uuid)
         virDispatchError(NULL);
         return -1;
     }
-    if (uuid == NULL) {
-        virLibNetworkError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuid, error);
 
     memcpy(uuid, &network->uuid[0], VIR_UUID_BUFLEN);
 
@@ -10233,10 +10088,7 @@ virNetworkGetUUIDString(virNetworkPtr network, char *buf)
         virDispatchError(NULL);
         return -1;
     }
-    if (buf == NULL) {
-        virLibNetworkError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(buf, error);
 
     if (virNetworkGetUUID(network, &uuid[0]))
         goto error;
@@ -10362,10 +10214,7 @@ virNetworkGetAutostart(virNetworkPtr network,
         virDispatchError(NULL);
         return -1;
     }
-    if (!autostart) {
-        virLibNetworkError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(autostart, error);
 
     conn = network->conn;
 
@@ -10520,10 +10369,8 @@ virConnectListInterfaces(virConnectPtr conn, char **const names, int maxnames)
         return -1;
     }
 
-    if ((names == NULL) || (maxnames < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (conn->interfaceDriver && conn->interfaceDriver->listInterfaces) {
         int ret;
@@ -10602,10 +10449,8 @@ virConnectListDefinedInterfaces(virConnectPtr conn,
         return -1;
     }
 
-    if ((names == NULL) || (maxnames < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (conn->interfaceDriver && conn->interfaceDriver->listDefinedInterfaces) {
         int ret;
@@ -10644,10 +10489,7 @@ virInterfaceLookupByName(virConnectPtr conn, const char *name)
         virDispatchError(NULL);
         return NULL;
     }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto  error;
-    }
+    virCheckNonNullArgGoto(name, error);
 
     if (conn->interfaceDriver && conn->interfaceDriver->interfaceLookupByName) {
         virInterfacePtr ret;
@@ -10686,10 +10528,7 @@ virInterfaceLookupByMACString(virConnectPtr conn, const char *macstr)
         virDispatchError(NULL);
         return NULL;
     }
-    if (macstr == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto  error;
-    }
+    virCheckNonNullArgGoto(macstr, error);
 
     if (conn->interfaceDriver && conn->interfaceDriver->interfaceLookupByMACString) {
         virInterfacePtr ret;
@@ -10841,10 +10680,7 @@ virInterfaceDefineXML(virConnectPtr conn, const char *xml, unsigned int flags)
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (xml == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xml, error);
 
     if (conn->interfaceDriver && conn->interfaceDriver->interfaceDefineXML) {
         virInterfacePtr ret;
@@ -11312,10 +11148,8 @@ virConnectListStoragePools(virConnectPtr conn,
         return -1;
     }
 
-    if ((names == NULL) || (maxnames < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (conn->storageDriver && conn->storageDriver->listPools) {
         int ret;
@@ -11397,10 +11231,8 @@ virConnectListDefinedStoragePools(virConnectPtr conn,
         return -1;
     }
 
-    if ((names == NULL) || (maxnames < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (conn->storageDriver && conn->storageDriver->listDefinedPools) {
         int ret;
@@ -11455,10 +11287,7 @@ virConnectFindStoragePoolSources(virConnectPtr conn,
         virDispatchError(NULL);
         return NULL;
     }
-    if (type == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(type, error);
 
     if (conn->flags & VIR_CONNECT_RO) {
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@@ -11503,10 +11332,7 @@ virStoragePoolLookupByName(virConnectPtr conn,
         virDispatchError(NULL);
         return NULL;
     }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(name, error);
 
     if (conn->storageDriver && conn->storageDriver->poolLookupByName) {
         virStoragePoolPtr ret;
@@ -11546,10 +11372,7 @@ virStoragePoolLookupByUUID(virConnectPtr conn,
         virDispatchError(NULL);
         return NULL;
     }
-    if (uuid == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuid, error);
 
     if (conn->storageDriver && conn->storageDriver->poolLookupByUUID) {
         virStoragePoolPtr ret;
@@ -11590,13 +11413,12 @@ virStoragePoolLookupByUUIDString(virConnectPtr conn,
         virDispatchError(NULL);
         return NULL;
     }
-    if (uuidstr == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuidstr, error);
 
     if (virUUIDParse(uuidstr, uuid) < 0) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(uuidstr,
+                            _("uuidstr in %s must be a valid UUID"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -11670,10 +11492,8 @@ virStoragePoolCreateXML(virConnectPtr conn,
         virDispatchError(NULL);
         return NULL;
     }
-    if (xmlDesc == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xmlDesc, error);
+
     if (conn->flags & VIR_CONNECT_RO) {
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
@@ -11723,10 +11543,7 @@ virStoragePoolDefineXML(virConnectPtr conn,
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (xml == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xml, error);
 
     if (conn->storageDriver && conn->storageDriver->poolDefineXML) {
         virStoragePoolPtr ret;
@@ -12025,7 +11842,7 @@ int
 virStoragePoolRef(virStoragePoolPtr pool)
 {
     if ((!VIR_IS_CONNECTED_STORAGE_POOL(pool))) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virLibConnError(VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
         virDispatchError(NULL);
         return -1;
     }
@@ -12130,10 +11947,7 @@ virStoragePoolGetUUID(virStoragePoolPtr pool,
         virDispatchError(NULL);
         return -1;
     }
-    if (uuid == NULL) {
-        virLibStoragePoolError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuid, error);
 
     memcpy(uuid, &pool->uuid[0], VIR_UUID_BUFLEN);
 
@@ -12167,10 +11981,7 @@ virStoragePoolGetUUIDString(virStoragePoolPtr pool,
         virDispatchError(NULL);
         return -1;
     }
-    if (buf == NULL) {
-        virLibStoragePoolError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(buf, error);
 
     if (virStoragePoolGetUUID(pool, &uuid[0]))
         goto error;
@@ -12208,10 +12019,7 @@ virStoragePoolGetInfo(virStoragePoolPtr pool,
         virDispatchError(NULL);
         return -1;
     }
-    if (info == NULL) {
-        virLibStoragePoolError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(info, error);
 
     memset(info, 0, sizeof(virStoragePoolInfo));
 
@@ -12301,10 +12109,7 @@ virStoragePoolGetAutostart(virStoragePoolPtr pool,
         virDispatchError(NULL);
         return -1;
     }
-    if (!autostart) {
-        virLibStoragePoolError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(autostart, error);
 
     conn = pool->conn;
 
@@ -12434,10 +12239,8 @@ virStoragePoolListVolumes(virStoragePoolPtr pool,
         return -1;
     }
 
-    if ((names == NULL) || (maxnames < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (pool->conn->storageDriver && pool->conn->storageDriver->poolListVolumes) {
         int ret;
@@ -12508,10 +12311,8 @@ virStorageVolLookupByName(virStoragePoolPtr pool,
         virDispatchError(NULL);
         return NULL;
     }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+
+    virCheckNonNullArgGoto(name, error);
 
     if (pool->conn->storageDriver && pool->conn->storageDriver->volLookupByName) {
         virStorageVolPtr ret;
@@ -12553,10 +12354,8 @@ virStorageVolLookupByKey(virConnectPtr conn,
         virDispatchError(NULL);
         return NULL;
     }
-    if (key == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+
+    virCheckNonNullArgGoto(key, error);
 
     if (conn->storageDriver && conn->storageDriver->volLookupByKey) {
         virStorageVolPtr ret;
@@ -12596,10 +12395,7 @@ virStorageVolLookupByPath(virConnectPtr conn,
         virDispatchError(NULL);
         return NULL;
     }
-    if (path == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(path, error);
 
     if (conn->storageDriver && conn->storageDriver->volLookupByPath) {
         virStorageVolPtr ret;
@@ -12695,10 +12491,7 @@ virStorageVolCreateXML(virStoragePoolPtr pool,
         return NULL;
     }
 
-    if (xmldesc == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xmldesc, error);
 
     if (pool->conn->flags & VIR_CONNECT_RO) {
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@@ -12756,10 +12549,7 @@ virStorageVolCreateXMLFrom(virStoragePoolPtr pool,
         goto error;
     }
 
-    if (xmldesc == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xmldesc, error);
 
     if (pool->conn->flags & VIR_CONNECT_RO ||
         clonevol->conn->flags & VIR_CONNECT_RO) {
@@ -13117,7 +12907,7 @@ int
 virStorageVolRef(virStorageVolPtr vol)
 {
     if ((!VIR_IS_CONNECTED_STORAGE_VOL(vol))) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virLibConnError(VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
         virDispatchError(NULL);
         return -1;
     }
@@ -13152,10 +12942,7 @@ virStorageVolGetInfo(virStorageVolPtr vol,
         virDispatchError(NULL);
         return -1;
     }
-    if (info == NULL) {
-        virLibStorageVolError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(info, error);
 
     memset(info, 0, sizeof(virStorageVolInfo));
 
@@ -13323,7 +13110,9 @@ virStorageVolResize(virStorageVolPtr vol,
     /* Zero capacity is only valid with either delta or shrink.  */
     if (capacity == 0 && !((flags & VIR_STORAGE_VOL_RESIZE_DELTA) ||
                            (flags & VIR_STORAGE_VOL_RESIZE_SHRINK))) {
-        virLibStorageVolError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(capacity,
+                            _("capacity in %s cannot be zero without 'delta' or 'shrink' flags set"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -13415,10 +13204,8 @@ virNodeListDevices(virConnectPtr conn,
         virDispatchError(NULL);
         return -1;
     }
-    if ((names == NULL) || (maxnames < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (conn->deviceMonitor && conn->deviceMonitor->listDevices) {
         int ret;
@@ -13457,10 +13244,7 @@ virNodeDevicePtr virNodeDeviceLookupByName(virConnectPtr conn, const char *name)
         return NULL;
     }
 
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(name, error);
 
     if (conn->deviceMonitor && conn->deviceMonitor->deviceLookupByName) {
         virNodeDevicePtr ret;
@@ -13630,10 +13414,8 @@ int virNodeDeviceListCaps(virNodeDevicePtr dev,
         return -1;
     }
 
-    if (names == NULL || maxnames < 0) {
-        virLibNodeDeviceError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (dev->conn->deviceMonitor && dev->conn->deviceMonitor->deviceListCaps) {
         int ret;
@@ -13700,7 +13482,7 @@ int
 virNodeDeviceRef(virNodeDevicePtr dev)
 {
     if ((!VIR_IS_CONNECTED_NODE_DEVICE(dev))) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virLibConnError(VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
         virDispatchError(NULL);
         return -1;
     }
@@ -13893,10 +13675,7 @@ virNodeDeviceCreateXML(virConnectPtr conn,
         goto error;
     }
 
-    if (xmlDesc == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xmlDesc, error);
 
     if (conn->deviceMonitor &&
         conn->deviceMonitor->deviceCreateXML) {
@@ -14000,10 +13779,7 @@ virConnectDomainEventRegister(virConnectPtr conn,
         virDispatchError(NULL);
         return -1;
     }
-    if (cb == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(cb, error);
 
     if ((conn->driver) && (conn->driver->domainEventRegister)) {
         int ret;
@@ -14046,10 +13822,8 @@ virConnectDomainEventDeregister(virConnectPtr conn,
         virDispatchError(NULL);
         return -1;
     }
-    if (cb == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(cb, error);
+
     if ((conn->driver) && (conn->driver->domainEventDeregister)) {
         int ret;
         ret = conn->driver->domainEventDeregister (conn, cb);
@@ -14151,10 +13925,8 @@ virConnectListSecrets(virConnectPtr conn, char **uuids, int maxuuids)
         virDispatchError(NULL);
         return -1;
     }
-    if (uuids == NULL || maxuuids < 0) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuids, error);
+    virCheckNonNegativeArgGoto(maxuuids, error);
 
     if (conn->secretDriver != NULL && conn->secretDriver->listSecrets != NULL) {
         int ret;
@@ -14195,10 +13967,7 @@ virSecretLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
         virDispatchError(NULL);
         return NULL;
     }
-    if (uuid == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuid, error);
 
     if (conn->secretDriver &&
         conn->secretDriver->lookupByUUID) {
@@ -14240,13 +14009,12 @@ virSecretLookupByUUIDString(virConnectPtr conn, const char *uuidstr)
         virDispatchError(NULL);
         return NULL;
     }
-    if (uuidstr == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuidstr, error);
 
     if (virUUIDParse(uuidstr, uuid) < 0) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(uuidstr,
+                            _("uuidstr in %s must be a valid UUID"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -14285,10 +14053,7 @@ virSecretLookupByUsage(virConnectPtr conn,
         virDispatchError(NULL);
         return NULL;
     }
-    if (usageID == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(usageID, error);
 
     if (conn->secretDriver &&
         conn->secretDriver->lookupByUsage) {
@@ -14338,10 +14103,7 @@ virSecretDefineXML(virConnectPtr conn, const char *xml, unsigned int flags)
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (xml == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xml, error);
 
     if (conn->secretDriver != NULL && conn->secretDriver->defineXML != NULL) {
         virSecretPtr ret;
@@ -14381,15 +14143,15 @@ virSecretGetUUID(virSecretPtr secret, unsigned char *uuid)
         virDispatchError(NULL);
         return -1;
     }
-    if (uuid == NULL) {
-        virLibSecretError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        virDispatchError(secret->conn);
-        return -1;
-    }
+    virCheckNonNullArgGoto(uuid, error);
 
     memcpy(uuid, &secret->uuid[0], VIR_UUID_BUFLEN);
 
     return 0;
+
+error:
+    virDispatchError(NULL);
+    return -1;
 }
 
 /**
@@ -14415,10 +14177,7 @@ virSecretGetUUIDString(virSecretPtr secret, char *buf)
         virDispatchError(NULL);
         return -1;
     }
-    if (buf == NULL) {
-        virLibSecretError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(buf, error);
 
     if (virSecretGetUUID(secret, &uuid[0]))
         goto error;
@@ -14565,10 +14324,7 @@ virSecretSetValue(virSecretPtr secret, const unsigned char *value,
         virLibSecretError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (value == NULL) {
-        virLibSecretError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(value, error);
 
     if (conn->secretDriver != NULL && conn->secretDriver->setValue != NULL) {
         int ret;
@@ -14616,10 +14372,7 @@ virSecretGetValue(virSecretPtr secret, size_t *value_size, unsigned int flags)
         virLibSecretError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
     }
-    if (value_size == NULL) {
-        virLibSecretError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(value_size, error);
 
     if (conn->secretDriver != NULL && conn->secretDriver->getValue != NULL) {
         unsigned char *ret;
@@ -14801,7 +14554,7 @@ int
 virStreamRef(virStreamPtr stream)
 {
     if ((!VIR_IS_CONNECTED_STREAM(stream))) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virLibConnError(VIR_ERR_INVALID_STREAM, __FUNCTION__);
         virDispatchError(NULL);
         return -1;
     }
@@ -14891,10 +14644,7 @@ int virStreamSend(virStreamPtr stream,
         return -1;
     }
 
-    if (data == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(data, error);
 
     if (stream->driver &&
         stream->driver->streamSend) {
@@ -14991,10 +14741,7 @@ int virStreamRecv(virStreamPtr stream,
         return -1;
     }
 
-    if (data == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(data, error);
 
     if (stream->driver &&
         stream->driver->streamRecv) {
@@ -15072,10 +14819,7 @@ int virStreamSendAll(virStreamPtr stream,
         return -1;
     }
 
-    if (handler == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto cleanup;
-    }
+    virCheckNonNullArgGoto(handler, cleanup);
 
     if (stream->flags & VIR_STREAM_NONBLOCK) {
         virLibConnError(VIR_ERR_OPERATION_INVALID,
@@ -15174,10 +14918,7 @@ int virStreamRecvAll(virStreamPtr stream,
         return -1;
     }
 
-    if (handler == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto cleanup;
-    }
+    virCheckNonNullArgGoto(handler, cleanup);
 
     if (stream->flags & VIR_STREAM_NONBLOCK) {
         virLibConnError(VIR_ERR_OPERATION_INVALID,
@@ -15768,10 +15509,8 @@ virConnectListNWFilters(virConnectPtr conn, char **const names, int maxnames)
         return -1;
     }
 
-    if ((names == NULL) || (maxnames < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(maxnames, error);
 
     if (conn->nwfilterDriver && conn->nwfilterDriver->listNWFilters) {
         int ret;
@@ -15811,10 +15550,7 @@ virNWFilterLookupByName(virConnectPtr conn, const char *name)
         virDispatchError(NULL);
         return NULL;
     }
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto  error;
-    }
+    virCheckNonNullArgGoto(name, error);
 
     if (conn->nwfilterDriver && conn->nwfilterDriver->nwfilterLookupByName) {
         virNWFilterPtr ret;
@@ -15853,10 +15589,7 @@ virNWFilterLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
         virDispatchError(NULL);
         return NULL;
     }
-    if (uuid == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuid, error);
 
     if (conn->nwfilterDriver && conn->nwfilterDriver->nwfilterLookupByUUID){
         virNWFilterPtr ret;
@@ -15896,13 +15629,12 @@ virNWFilterLookupByUUIDString(virConnectPtr conn, const char *uuidstr)
         virDispatchError(NULL);
         return NULL;
     }
-    if (uuidstr == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuidstr, error);
 
     if (virUUIDParse(uuidstr, uuid) < 0) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(uuidstr,
+                            _("uuidstr in %s must be a valid UUID"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -15986,10 +15718,7 @@ virNWFilterGetUUID(virNWFilterPtr nwfilter, unsigned char *uuid)
         virDispatchError(NULL);
         return -1;
     }
-    if (uuid == NULL) {
-        virLibNWFilterError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(uuid, error);
 
     memcpy(uuid, &nwfilter->uuid[0], VIR_UUID_BUFLEN);
 
@@ -16023,10 +15752,7 @@ virNWFilterGetUUIDString(virNWFilterPtr nwfilter, char *buf)
         virDispatchError(NULL);
         return -1;
     }
-    if (buf == NULL) {
-        virLibNWFilterError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(buf, error);
 
     if (virNWFilterGetUUID(nwfilter, &uuid[0]))
         goto error;
@@ -16062,10 +15788,8 @@ virNWFilterDefineXML(virConnectPtr conn, const char *xmlDesc)
         virDispatchError(NULL);
         return NULL;
     }
-    if (xmlDesc == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xmlDesc, error);
+
     if (conn->flags & VIR_CONNECT_RO) {
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
@@ -16197,7 +15921,7 @@ int
 virNWFilterRef(virNWFilterPtr nwfilter)
 {
     if ((!VIR_IS_CONNECTED_NWFILTER(nwfilter))) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virLibConnError(VIR_ERR_INVALID_NWFILTER, __FUNCTION__);
         virDispatchError(NULL);
         return -1;
     }
@@ -16338,10 +16062,7 @@ virConnectCompareCPU(virConnectPtr conn,
         virDispatchError(NULL);
         return VIR_CPU_COMPARE_ERROR;
     }
-    if (xmlDesc == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xmlDesc, error);
 
     if (conn->driver->cpuCompare) {
         int ret;
@@ -16395,10 +16116,7 @@ virConnectBaselineCPU(virConnectPtr conn,
         virDispatchError(NULL);
         return NULL;
     }
-    if (xmlCPUs == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xmlCPUs, error);
 
     if (conn->driver->cpuBaseline) {
         char *cpu;
@@ -16441,10 +16159,7 @@ virDomainGetJobInfo(virDomainPtr domain, virDomainJobInfoPtr info)
         virDispatchError(NULL);
         return -1;
     }
-    if (info == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(info, error);
 
     memset(info, 0, sizeof(virDomainJobInfo));
 
@@ -16637,10 +16352,7 @@ virDomainMigrateGetMaxSpeed(virDomainPtr domain,
 
     conn = domain->conn;
 
-    if (!bandwidth) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(bandwidth, error);
 
     if (conn->flags & VIR_CONNECT_RO) {
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@@ -16716,8 +16428,12 @@ virConnectDomainEventRegisterAny(virConnectPtr conn,
         virDispatchError(conn);
         return -1;
     }
-    if (eventID < 0 || eventID >= VIR_DOMAIN_EVENT_ID_LAST || cb == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+    virCheckNonNullArgGoto(cb, error);
+    virCheckNonNegativeArgGoto(eventID, error);
+    if (eventID >= VIR_DOMAIN_EVENT_ID_LAST) {
+        virReportInvalidArg(eventID,
+                            _("eventID in %s must be less than %d"),
+                            __FUNCTION__, VIR_DOMAIN_EVENT_ID_LAST);
         goto error;
     }
 
@@ -16758,10 +16474,8 @@ virConnectDomainEventDeregisterAny(virConnectPtr conn,
         virDispatchError(NULL);
         return -1;
     }
-    if (callbackID < 0) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNegativeArgGoto(callbackID, error);
+
     if ((conn->driver) && (conn->driver->domainEventDeregisterAny)) {
         int ret;
         ret = conn->driver->domainEventDeregisterAny(conn, callbackID);
@@ -16826,8 +16540,9 @@ int virDomainManagedSave(virDomainPtr dom, unsigned int flags)
     }
 
     if ((flags & VIR_DOMAIN_SAVE_RUNNING) && (flags & VIR_DOMAIN_SAVE_PAUSED)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("running and paused flags are mutually exclusive"));
+        virReportInvalidArg(flags,
+                            _("running and paused flags in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -17119,10 +16834,7 @@ virDomainSnapshotCreateXML(virDomainPtr domain,
 
     conn = domain->conn;
 
-    if (xmlDesc == NULL) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(xmlDesc, error);
 
     if (conn->flags & VIR_CONNECT_RO) {
         virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
@@ -17131,20 +16843,23 @@ virDomainSnapshotCreateXML(virDomainPtr domain,
 
     if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT) &&
         !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("use of current flag requires redefine flag"));
+        virReportInvalidArg(flags,
+                            _("use of current flag in %s requires redefine flag"),
+                            __FUNCTION__);
         goto error;
     }
     if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE) &&
         (flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                   _("redefine and no metadata flags are mutually exclusive"));
+        virReportInvalidArg(flags,
+                            _("redefine and no metadata flags in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
     if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE) &&
         (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                   _("redefine and halt flags are mutually exclusive"));
+        virReportInvalidArg(flags,
+                            _("redefine and halt flags in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -17308,10 +17023,8 @@ virDomainSnapshotListNames(virDomainPtr domain, char **names, int nameslen,
 
     conn = domain->conn;
 
-    if ((names == NULL) || (nameslen < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(nameslen, error);
 
     if (conn->driver->domainSnapshotListNames) {
         int ret = conn->driver->domainSnapshotListNames(domain, names,
@@ -17423,10 +17136,8 @@ virDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot,
 
     conn = snapshot->domain->conn;
 
-    if ((names == NULL) || (nameslen < 0)) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(names, error);
+    virCheckNonNegativeArgGoto(nameslen, error);
 
     if (conn->driver->domainSnapshotListChildrenNames) {
         int ret = conn->driver->domainSnapshotListChildrenNames(snapshot,
@@ -17475,10 +17186,7 @@ virDomainSnapshotLookupByName(virDomainPtr domain,
 
     conn = domain->conn;
 
-    if (name == NULL) {
-        virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(name, error);
 
     if (conn->driver->domainSnapshotLookupByName) {
         virDomainSnapshotPtr dom;
@@ -17688,8 +17396,9 @@ virDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
 
     if ((flags & VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING) &&
         (flags & VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("running and paused flags are mutually exclusive"));
+        virReportInvalidArg(flags,
+                            _("running and paused flags in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -17755,9 +17464,10 @@ virDomainSnapshotDelete(virDomainSnapshotPtr snapshot,
 
     if ((flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN) &&
         (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("children and children_only flags are "
-                            "mutually exclusive"));
+        virReportInvalidArg(flags,
+                            _("children and children_only flags in %s are "
+                              "mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -17933,11 +17643,7 @@ int virDomainBlockJobAbort(virDomainPtr dom, const char *disk,
         goto error;
     }
 
-    if (!disk) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("disk is NULL"));
-        goto error;
-    }
+    virCheckNonNullArgGoto(disk, error);
 
     if (conn->driver->domainBlockJobAbort) {
         int ret;
@@ -17989,17 +17695,8 @@ int virDomainGetBlockJobInfo(virDomainPtr dom, const char *disk,
     }
     conn = dom->conn;
 
-    if (!disk) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("disk is NULL"));
-        goto error;
-    }
-
-    if (!info) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                           _("info is NULL"));
-        goto error;
-    }
+    virCheckNonNullArgGoto(disk, error);
+    virCheckNonNullArgGoto(info, error);
 
     if (conn->driver->domainGetBlockJobInfo) {
         int ret;
@@ -18057,11 +17754,7 @@ int virDomainBlockJobSetSpeed(virDomainPtr dom, const char *disk,
         goto error;
     }
 
-    if (!disk) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("disk is NULL"));
-        goto error;
-    }
+    virCheckNonNullArgGoto(disk, error);
 
     if (conn->driver->domainBlockJobSetSpeed) {
         int ret;
@@ -18132,11 +17825,7 @@ int virDomainBlockPull(virDomainPtr dom, const char *disk,
         goto error;
     }
 
-    if (!disk) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("disk is NULL"));
-        goto error;
-    }
+    virCheckNonNullArgGoto(disk, error);
 
     if (conn->driver->domainBlockPull) {
         int ret;
@@ -18254,23 +17943,16 @@ int virDomainBlockRebase(virDomainPtr dom, const char *disk,
         goto error;
     }
 
-    if (!disk) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("disk is NULL"));
-        goto error;
-    }
+    virCheckNonNullArgGoto(disk, error);
 
     if (flags & VIR_DOMAIN_BLOCK_REBASE_COPY) {
-        if (!base) {
-            virLibDomainError(VIR_ERR_INVALID_ARG,
-                              _("base is required when starting a copy"));
-            goto error;
-        }
+        virCheckNonNullArgGoto(base, error);
     } else if (flags & (VIR_DOMAIN_BLOCK_REBASE_SHALLOW |
                         VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT |
                         VIR_DOMAIN_BLOCK_REBASE_COPY_RAW)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("use of flags requires a copy job"));
+        virReportInvalidArg(flags,
+                            _("use of flags in %s requires a copy job"),
+                            __FUNCTION__);
         goto error;
     }
 
@@ -18332,10 +18014,7 @@ int virDomainOpenGraphics(virDomainPtr dom,
         return -1;
     }
 
-    if (fd < 0) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNegativeArgGoto(fd, error);
 
     if (fstat(fd, &sb) < 0) {
         virReportSystemError(errno,
@@ -18344,8 +18023,9 @@ int virDomainOpenGraphics(virDomainPtr dom,
     }
 
     if (!S_ISSOCK(sb.st_mode)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG,
-                          _("File descriptor %d must be a socket"), fd);
+        virReportInvalidArg(fd,
+                          _("fd %d in %s must be a socket"),
+                            fd, __FUNCTION__);
         goto error;
     }
 
@@ -18512,13 +18192,12 @@ int virDomainSetBlockIoTune(virDomainPtr dom,
         goto error;
     }
 
-    if (!disk || (nparams <= 0) || (params == NULL)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
-    }
+    virCheckNonNullArgGoto(disk, error);
+    virCheckPositiveArgGoto(nparams, error);
+    virCheckNonNullArgGoto(params, error);
 
     if (virTypedParameterValidateSet(dom, params, nparams) < 0)
-        return -1;
+        goto error;
 
     conn = dom->conn;
 
@@ -18589,10 +18268,11 @@ int virDomainGetBlockIoTune(virDomainPtr dom,
         return -1;
     }
 
-    if (nparams == NULL || *nparams < 0 ||
-        ((params == NULL || disk == NULL) && *nparams != 0)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-        goto error;
+    virCheckNonNullArgGoto(nparams, error);
+    virCheckNonNegativeArgGoto(*nparams, error);
+    if (*nparams != 0) {
+        virCheckNonNullArgGoto(params, error);
+        virCheckNonNullArgGoto(disk, error);
     }
 
     if (VIR_DRV_SUPPORTS_FEATURE(dom->conn->driver, dom->conn,
@@ -18602,7 +18282,9 @@ int virDomainGetBlockIoTune(virDomainPtr dom,
     /* At most one of these two flags should be set.  */
     if ((flags & VIR_DOMAIN_AFFECT_LIVE) &&
         (flags & VIR_DOMAIN_AFFECT_CONFIG)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        virReportInvalidArg(flags,
+                            _("flags 'affect live' and 'affect config' in %s are mutually exclusive"),
+                            __FUNCTION__);
         goto error;
     }
     conn = dom->conn;
@@ -18724,13 +18406,19 @@ int virDomainGetCPUStats(virDomainPtr domain,
      * ncpus must be non-zero unless params == NULL
      * nparams * ncpus must not overflow (RPC may restrict it even more)
      */
-    if (start_cpu < -1 ||
-        (start_cpu == -1 && ncpus != 1) ||
-        ((params == NULL) != (nparams == 0)) ||
-        (ncpus == 0 && params != NULL)) {
-        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+    if (start_cpu < -1 && ncpus != -1) {
+        virReportInvalidArg(start_cpu,
+                            _("start_cpu in %s must be -1 or greater if ncpus is not -1"),
+                            __FUNCTION__);
         goto error;
     }
+    if (nparams)
+        virCheckNonNullArgGoto(params, error);
+    else
+        virCheckNullArgGoto(params, error);
+    if (ncpus == 0)
+        virCheckNullArgGoto(params, error);
+
     if (nparams && ncpus > UINT_MAX / nparams) {
         virLibDomainError(VIR_ERR_OVERFLOW, _("input too large: %u * %u"),
                           nparams, ncpus);
diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index 1c4272b..f7d0cc6 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -451,8 +451,9 @@ int linuxNodeGetCPUStats(FILE *procstat,
     }
 
     if ((*nparams) != LINUX_NB_CPU_STATS) {
-        nodeReportError(VIR_ERR_INVALID_ARG,
-                        "%s", _("Invalid parameter count"));
+        virReportInvalidArg(*nparams,
+                            _("nparams in %s must be equal to %d"),
+                            __FUNCTION__, LINUX_NB_CPU_STATS);
         goto cleanup;
     }
 
@@ -526,7 +527,9 @@ int linuxNodeGetCPUStats(FILE *procstat,
         }
     }
 
-    nodeReportError(VIR_ERR_INVALID_ARG, "%s", _("Invalid cpu number"));
+    virReportInvalidArg(cpuNum,
+                        _("Invalid cpuNum in %s"),
+                        __FUNCTION__);
 
 cleanup:
     return ret;
@@ -569,8 +572,9 @@ int linuxNodeGetMemoryStats(FILE *meminfo,
     }
 
     if ((*nparams) != nr_param) {
-        nodeReportError(VIR_ERR_INVALID_ARG,
-                        "%s", _("Invalid stats count"));
+        virReportInvalidArg(nparams,
+                            _("nparams in %s must be %d"),
+                            __FUNCTION__, nr_param);
         goto cleanup;
     }
 
@@ -779,8 +783,9 @@ int nodeGetMemoryStats(virConnectPtr conn ATTRIBUTE_UNUSED,
 
 # if HAVE_NUMACTL
             if (cellNum > numa_max_node()) {
-                nodeReportError(VIR_ERR_INVALID_ARG, "%s",
-                                _("Invalid cell number"));
+                virReportInvalidArg(cellNum,
+                                    _("cellNum in %s must be less than or equal to %d"),
+                                    __FUNCTION__, numa_max_node());
                 return -1;
             }
 # endif
diff --git a/src/util/virterror_internal.h b/src/util/virterror_internal.h
index b8cb279..cb7df03 100644
--- a/src/util/virterror_internal.h
+++ b/src/util/virterror_internal.h
@@ -68,6 +68,83 @@ void virReportSystemErrorFull(int domcode,
                              __FILE__, __FUNCTION__, __LINE__,    \
                              (fmt), __VA_ARGS__)
 
+# define virReportInvalidNullArg(argname)                            \
+    virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__,              \
+                      VIR_FROM_THIS,                                 \
+                      VIR_ERR_INVALID_ARG,                           \
+                      VIR_ERR_ERROR,                                 \
+                      __FUNCTION__,                                  \
+                      #argname,                                      \
+                      NULL,                                          \
+                      0, 0,                                          \
+                      _("%s in %s must be NULL"),                    \
+                      #argname, __FUNCTION__)
+# define virReportInvalidNonNullArg(argname)                         \
+    virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__,              \
+                      VIR_FROM_THIS,                                 \
+                      VIR_ERR_INVALID_ARG,                           \
+                      VIR_ERR_ERROR,                                 \
+                      __FUNCTION__,                                  \
+                      #argname,                                      \
+                      NULL,                                          \
+                      0, 0,                                          \
+                      _("%s in %s must not be NULL"),                \
+                      #argname, __FUNCTION__)
+# define virReportInvalidPositiveArg(argname)                        \
+    virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__,              \
+                      VIR_FROM_THIS,                                 \
+                      VIR_ERR_INVALID_ARG,                           \
+                      VIR_ERR_ERROR,                                 \
+                      __FUNCTION__,                                  \
+                      #argname,                                      \
+                      NULL,                                          \
+                      0, 0,                                          \
+                      _("%s in %s must greater than zero"),          \
+                      #argname, __FUNCTION__)
+# define virReportInvalidNonZeroArg(argname)                         \
+    virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__,              \
+                      VIR_FROM_THIS,                                 \
+                      VIR_ERR_INVALID_ARG,                           \
+                      VIR_ERR_ERROR,                                 \
+                      __FUNCTION__,                                  \
+                      #argname,                                      \
+                      NULL,                                          \
+                      0, 0,                                          \
+                      _("%s in %s must not be zero"),                \
+                      #argname, __FUNCTION__)
+# define virReportInvalidZeroArg(argname)                            \
+    virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__,              \
+                      VIR_FROM_THIS,                                 \
+                      VIR_ERR_INVALID_ARG,                           \
+                      VIR_ERR_ERROR,                                 \
+                      __FUNCTION__,                                  \
+                      #argname,                                      \
+                      NULL,                                          \
+                      0, 0,                                          \
+                      _("%s in %s must  be zero"),                   \
+                      #argname, __FUNCTION__)
+# define virReportInvalidNonNegativeArg(argname)                     \
+    virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__,              \
+                      VIR_FROM_THIS,                                 \
+                      VIR_ERR_INVALID_ARG,                           \
+                      VIR_ERR_ERROR,                                 \
+                      __FUNCTION__,                                  \
+                      #argname,                                      \
+                      NULL,                                          \
+                      0, 0,                                          \
+                      _("%s in %s must be zero or greater"),         \
+                      #argname, __FUNCTION__)
+# define virReportInvalidArg(argname, fmt, ...)                      \
+    virRaiseErrorFull(__FILE__, __FUNCTION__, __LINE__,              \
+                      VIR_FROM_THIS,                                 \
+                      VIR_ERR_INVALID_ARG,                           \
+                      VIR_ERR_ERROR,                                 \
+                      __FUNCTION__,                                  \
+                      #argname,                                      \
+                      NULL,                                          \
+                      0, 0,                                          \
+                      (fmt), __VA_ARGS__)
+
 void virReportOOMErrorFull(int domcode,
                            const char *filename,
                            const char *funcname,
-- 
1.7.10.1




More information about the libvir-list mailing list