Actually, I'm turning this function into a macro as filename,
function name and line number needs to be passed. The new
function virAsprintfInternal is introduced with the extended set
of arguments.
---
cfg.mk | 2 +-
src/conf/domain_audit.c | 36 ++++++++++-----------
src/driver.c | 4 +--
src/libvirt_private.syms | 4 +--
src/util/virerror.c | 2 +-
src/util/virstring.c | 36 ++++++++++++---------
src/util/virstring.h | 67 +++++++++++++++++++++++++++++++++++----
tests/domainsnapshotxml2xmltest.c | 2 ++
tests/fchosttest.c | 2 ++
tests/interfacexml2xmltest.c | 2 ++
tests/lxcxml2xmltest.c | 2 ++
tests/networkxml2xmltest.c | 2 ++
tests/nodedevxml2xmltest.c | 2 ++
tests/nodeinfotest.c | 2 ++
tests/nwfilterxml2xmltest.c | 2 ++
tests/qemuargv2xmltest.c | 2 ++
tests/qemuhelptest.c | 2 ++
tests/qemuxml2xmltest.c | 2 ++
tests/sexpr2xmltest.c | 2 ++
tests/storagepoolxml2xmltest.c | 2 ++
tests/storagevolxml2argvtest.c | 2 ++
tests/storagevolxml2xmltest.c | 2 ++
tests/sysinfotest.c | 2 ++
tests/virbuftest.c | 2 ++
tests/virhashtest.c | 2 ++
tests/virshtest.c | 2 ++
tests/xencapstest.c | 2 ++
tests/xml2sexprtest.c | 2 ++
tools/virt-host-validate-common.c | 2 ++
29 files changed, 150 insertions(+), 45 deletions(-)
diff --git a/cfg.mk b/cfg.mk
index bbe84b3..1b118a9 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -899,7 +899,7 @@ exclude_file_name_regexp--sc_prohibit_always_true_header_tests = \
^python/(libvirt-(lxc-|qemu-)?override|typewrappers)\.c$$
exclude_file_name_regexp--sc_prohibit_asprintf = \
-
^(bootstrap.conf$$|src/util/virstring\.c$$|examples/domain-events/events-c/event-test\.c$$|tests/vircgroupmock\.c$$)
+
^(bootstrap.conf$$|src/util/virstring\.[ch]$$|examples/domain-events/events-c/event-test\.c$$|tests/vircgroupmock\.c$$)
exclude_file_name_regexp--sc_prohibit_strdup = \
^(docs/|examples/|python/|src/util/virstring\.c$$)
diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c
index 97e71f7..e53daf8 100644
--- a/src/conf/domain_audit.c
+++ b/src/conf/domain_audit.c
@@ -46,7 +46,7 @@ virDomainAuditGetRdev(const char *path)
(S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode))) {
int maj = major(sb.st_rdev);
int min = minor(sb.st_rdev);
- ignore_value(virAsprintf(&ret, "%02X:%02X", maj, min));
+ ignore_value(virAsprintfQuiet(&ret, "%02X:%02X", maj, min));
}
return ret;
}
@@ -382,29 +382,29 @@ virDomainAuditHostdev(virDomainObjPtr vm, virDomainHostdevDefPtr
hostdev,
case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
switch (hostdev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
- if (virAsprintf(&address, "%.4x:%.2x:%.2x.%.1x",
- hostdev->source.subsys.u.pci.addr.domain,
- hostdev->source.subsys.u.pci.addr.bus,
- hostdev->source.subsys.u.pci.addr.slot,
- hostdev->source.subsys.u.pci.addr.function) < 0) {
+ if (virAsprintfQuiet(&address, "%.4x:%.2x:%.2x.%.1x",
+ hostdev->source.subsys.u.pci.addr.domain,
+ hostdev->source.subsys.u.pci.addr.bus,
+ hostdev->source.subsys.u.pci.addr.slot,
+ hostdev->source.subsys.u.pci.addr.function) < 0)
{
VIR_WARN("OOM while encoding audit message");
goto cleanup;
}
break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
- if (virAsprintf(&address, "%.3d.%.3d",
- hostdev->source.subsys.u.usb.bus,
- hostdev->source.subsys.u.usb.device) < 0) {
+ if (virAsprintfQuiet(&address, "%.3d.%.3d",
+ hostdev->source.subsys.u.usb.bus,
+ hostdev->source.subsys.u.usb.device) < 0) {
VIR_WARN("OOM while encoding audit message");
goto cleanup;
}
break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
- if (virAsprintf(&address, "%s:%d:%d:%d",
- hostdev->source.subsys.u.scsi.adapter,
- hostdev->source.subsys.u.scsi.bus,
- hostdev->source.subsys.u.scsi.target,
- hostdev->source.subsys.u.scsi.unit) < 0) {
+ if (virAsprintfQuiet(&address, "%s:%d:%d:%d",
+ hostdev->source.subsys.u.scsi.adapter,
+ hostdev->source.subsys.u.scsi.bus,
+ hostdev->source.subsys.u.scsi.target,
+ hostdev->source.subsys.u.scsi.unit) < 0) {
VIR_WARN("OOM while encoding audit message");
goto cleanup;
}
@@ -654,8 +654,8 @@ virDomainAuditCgroupMajor(virDomainObjPtr vm, virCgroupPtr cgroup,
{
char *extra;
- if (virAsprintf(&extra, "major category=%s maj=%02X acl=%s",
- name, maj, perms) < 0) {
+ if (virAsprintfQuiet(&extra, "major category=%s maj=%02X acl=%s",
+ name, maj, perms) < 0) {
VIR_WARN("OOM while encoding audit message");
return;
}
@@ -693,8 +693,8 @@ virDomainAuditCgroupPath(virDomainObjPtr vm, virCgroupPtr cgroup,
rdev = virDomainAuditGetRdev(path);
if (!(detail = virAuditEncode("path", path)) ||
- virAsprintf(&extra, "path %s rdev=%s acl=%s",
- detail, VIR_AUDIT_STR(rdev), perms) < 0) {
+ virAsprintfQuiet(&extra, "path %s rdev=%s acl=%s",
+ detail, VIR_AUDIT_STR(rdev), perms) < 0) {
VIR_WARN("OOM while encoding audit message");
goto cleanup;
}
diff --git a/src/driver.c b/src/driver.c
index c35fcd2..a08dd34 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -65,7 +65,7 @@ virDriverLoadModule(const char *name)
VIR_DEBUG("Module load %s", name);
- if (virAsprintf(&modfile, "%s/libvirt_driver_%s.so", moddir, name) <
0)
+ if (virAsprintfQuiet(&modfile, "%s/libvirt_driver_%s.so", moddir, name)
< 0)
return NULL;
if (access(modfile, R_OK) < 0) {
@@ -79,7 +79,7 @@ virDriverLoadModule(const char *name)
goto cleanup;
}
- if (virAsprintf(®func, "%sRegister", name) < 0) {
+ if (virAsprintfQuiet(®func, "%sRegister", name) < 0) {
goto cleanup;
}
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 6df5500..59583ec 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1871,7 +1871,7 @@ virStorageFileResize;
# util/virstring.h
virArgvToString;
-virAsprintf;
+virAsprintfInternal;
virSkipSpaces;
virSkipSpacesAndBackslash;
virSkipSpacesBackwards;
@@ -1892,7 +1892,7 @@ virStrToLong_ui;
virStrToLong_ul;
virStrToLong_ull;
virTrimSpaces;
-virVasprintf;
+virVasprintfInternal;
# util/virsysinfo.h
diff --git a/src/util/virerror.c b/src/util/virerror.c
index e238dce..ce3ab85 100644
--- a/src/util/virerror.c
+++ b/src/util/virerror.c
@@ -674,7 +674,7 @@ virRaiseErrorFull(const char *filename ATTRIBUTE_UNUSED,
} else {
va_list ap;
va_start(ap, fmt);
- ignore_value(virVasprintf(&str, fmt, ap));
+ ignore_value(virVasprintfQuiet(&str, fmt, ap));
va_end(ap);
}
diff --git a/src/util/virstring.c b/src/util/virstring.c
index 1937f82..6fc015b 100644
--- a/src/util/virstring.c
+++ b/src/util/virstring.c
@@ -321,35 +321,41 @@ virStrToDouble(char const *s,
return 0;
}
-/**
- * virVasprintf
- *
- * like glibc's vasprintf but makes sure *strp == NULL on failure
- */
int
-virVasprintf(char **strp, const char *fmt, va_list list)
+virVasprintfInternal(bool report,
+ int domcode,
+ const char *filename,
+ const char *funcname,
+ size_t linenr,
+ char **strp,
+ const char *fmt,
+ va_list list)
{
int ret;
- if ((ret = vasprintf(strp, fmt, list)) == -1)
+ if ((ret = vasprintf(strp, fmt, list)) == -1) {
+ if (report)
+ virReportOOMErrorFull(domcode, filename, funcname, linenr);
*strp = NULL;
-
+ }
return ret;
}
-/**
- * virAsprintf
- *
- * like glibc's_asprintf but makes sure *strp == NULL on failure
- */
int
-virAsprintf(char **strp, const char *fmt, ...)
+virAsprintfInternal(bool report,
+ int domcode,
+ const char *filename,
+ const char *funcname,
+ size_t linenr,
+ char **strp,
+ const char *fmt, ...)
{
va_list ap;
int ret;
va_start(ap, fmt);
- ret = virVasprintf(strp, fmt, ap);
+ ret = virVasprintfInternal(report, domcode, filename,
+ funcname, linenr, strp, fmt, ap);
va_end(ap);
return ret;
}
diff --git a/src/util/virstring.h b/src/util/virstring.h
index 34ffae1..8b66b23 100644
--- a/src/util/virstring.h
+++ b/src/util/virstring.h
@@ -76,12 +76,6 @@ void virTrimSpaces(char *str, char **endp) ATTRIBUTE_NONNULL(1);
void virSkipSpacesBackwards(const char *str, char **endp)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-int virAsprintf(char **strp, const char *fmt, ...)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_FMT_PRINTF(2, 3)
- ATTRIBUTE_RETURN_CHECK;
-int virVasprintf(char **strp, const char *fmt, va_list list)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_FMT_PRINTF(2, 0)
- ATTRIBUTE_RETURN_CHECK;
char *virStrncpy(char *dest, const char *src, size_t n, size_t destbytes)
ATTRIBUTE_RETURN_CHECK;
char *virStrcpy(char *dest, const char *src, size_t destbytes)
@@ -96,6 +90,16 @@ int virStrdup(char **dest, const char *src, bool report, int domcode,
int virStrndup(char **dest, const char *src, ssize_t n, bool report, int domcode,
const char *filename, const char *funcname, size_t linenr)
ATTRIBUTE_RETURN_CHECK ATTRIBUTE_NONNULL(1);
+int virAsprintfInternal(bool report, int domcode, const char *filename,
+ const char *funcname, size_t linenr, char **strp,
+ const char *fmt, ...)
+ ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7) ATTRIBUTE_FMT_PRINTF(7, 8)
+ ATTRIBUTE_RETURN_CHECK;
+int virVasprintfInternal(bool report, int domcode, const char *filename,
+ const char *funcname, size_t linenr, char **strp,
+ const char *fmt, va_list list)
+ ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7) ATTRIBUTE_FMT_PRINTF(7, 0)
+ ATTRIBUTE_RETURN_CHECK;
/**
* VIR_STRDUP:
@@ -166,4 +170,55 @@ int virStrndup(char **dest, const char *src, ssize_t n, bool report,
int domcode
size_t virStringListLength(char **strings);
+/**
+ * virVasprintf
+ *
+ * Like glibc's vasprintf but makes sure *strp == NULL on failure, in which
+ * case the OOM error is reported too.
+ *
+ * Returns -1 on failure (with OOM error reported), 0 on success.
+ */
+# define virVasprintf(strp, fmt, list) \
+ virVasprintfInternal(true, VIR_FROM_THIS, __FILE__, __FUNCTION__, \
+ __LINE__, strp, fmt, list)
+
+/**
+ * virVasprintfQuiet
+ *
+ * Like glibc's vasprintf but makes sure *strp == NULL on failure.
+ *
+ * Returns -1 on failure, 0 on success.
+ */
+# define virVasprintfQuiet(strp, fmt, list) \
+ virVasprintfInternal(false, 0, NULL, NULL, 0, strp, fmt, list)
+
+/**
+ * virAsprintf:
+ * @strp: variable to hold result (char **)
+ * @fmt: printf format
+ *
+ * Like glibc's_asprintf but makes sure *strp == NULL on failure, in which case
+ * the OOM error is reported too.
+ *
+ * Returns -1 on failure (with OOM error reported), 0 on success.
+ */
+
+# define virAsprintf(strp, ...) \
+ virAsprintfInternal(true, VIR_FROM_THIS, __FILE__, __FUNCTION__, __LINE__, \
+ strp, __VA_ARGS__)
+
+/**
+ * virAsprintfQuiet:
+ * @strp: variable to hold result (char **)
+ * @fmt: printf format
+ *
+ * Like glibc's_asprintf but makes sure *strp == NULL on failure.
+ *
+ * Returns -1 on failure, 0 on success.
+ */
+
+# define virAsprintfQuiet(strp, ...) \
+ virAsprintfInternal(false, 0, NULL, NULL, 0, \
+ strp, __VA_ARGS__)
+
#endif /* __VIR_STRING_H__ */
diff --git a/tests/domainsnapshotxml2xmltest.c b/tests/domainsnapshotxml2xmltest.c
index 9eddf45..defa955 100644
--- a/tests/domainsnapshotxml2xmltest.c
+++ b/tests/domainsnapshotxml2xmltest.c
@@ -18,6 +18,8 @@
# include "testutilsqemu.h"
# include "virstring.h"
+# define VIR_FROM_THIS VIR_FROM_NONE
+
static virQEMUDriver driver;
static int
diff --git a/tests/fchosttest.c b/tests/fchosttest.c
index 76d1795..05ff20b 100644
--- a/tests/fchosttest.c
+++ b/tests/fchosttest.c
@@ -23,6 +23,8 @@
#include "virutil.h"
#include "testutils.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static char *fchost_prefix;
#define TEST_FC_HOST_PREFIX fchost_prefix
diff --git a/tests/interfacexml2xmltest.c b/tests/interfacexml2xmltest.c
index 9d86198..8092a59 100644
--- a/tests/interfacexml2xmltest.c
+++ b/tests/interfacexml2xmltest.c
@@ -14,6 +14,8 @@
#include "testutilsqemu.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static int
testCompareXMLToXMLFiles(const char *xml)
{
diff --git a/tests/lxcxml2xmltest.c b/tests/lxcxml2xmltest.c
index 97f792c..ca05d29 100644
--- a/tests/lxcxml2xmltest.c
+++ b/tests/lxcxml2xmltest.c
@@ -17,6 +17,8 @@
# include "testutilslxc.h"
# include "virstring.h"
+# define VIR_FROM_THIS VIR_FROM_NONE
+
static virCapsPtr caps;
static virDomainXMLOptionPtr xmlopt;
diff --git a/tests/networkxml2xmltest.c b/tests/networkxml2xmltest.c
index 5eca143..0dfed16 100644
--- a/tests/networkxml2xmltest.c
+++ b/tests/networkxml2xmltest.c
@@ -14,6 +14,8 @@
#include "testutilsqemu.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static int
testCompareXMLToXMLFiles(const char *inxml, const char *outxml,
unsigned int flags)
diff --git a/tests/nodedevxml2xmltest.c b/tests/nodedevxml2xmltest.c
index ed49857..d4f7ee7 100644
--- a/tests/nodedevxml2xmltest.c
+++ b/tests/nodedevxml2xmltest.c
@@ -14,6 +14,8 @@
#include "testutilsqemu.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static int
testCompareXMLToXMLFiles(const char *xml)
{
diff --git a/tests/nodeinfotest.c b/tests/nodeinfotest.c
index bce56f3..def366c 100644
--- a/tests/nodeinfotest.c
+++ b/tests/nodeinfotest.c
@@ -11,6 +11,8 @@
#include "virfile.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
#if ! (defined __linux__ && (defined(__x86_64__) || \
defined(__amd64__) || \
defined(__i386__) || \
diff --git a/tests/nwfilterxml2xmltest.c b/tests/nwfilterxml2xmltest.c
index 158bc9f..5476284 100644
--- a/tests/nwfilterxml2xmltest.c
+++ b/tests/nwfilterxml2xmltest.c
@@ -17,6 +17,8 @@
#include "testutilsqemu.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static int
testCompareXMLToXMLFiles(const char *inxml, const char *outxml,
bool expect_error)
diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
index 652cd09..5cf7828 100644
--- a/tests/qemuargv2xmltest.c
+++ b/tests/qemuargv2xmltest.c
@@ -17,6 +17,8 @@
# include "testutilsqemu.h"
# include "virstring.h"
+# define VIR_FROM_THIS VIR_FROM_NONE
+
static virQEMUDriver driver;
static int blankProblemElements(char *data)
diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c
index 2a3b019..3826849 100644
--- a/tests/qemuhelptest.c
+++ b/tests/qemuhelptest.c
@@ -11,6 +11,8 @@
# include "viralloc.h"
# include "virstring.h"
+# define VIR_FROM_THIS VIR_FROM_NONE
+
struct testInfo {
const char *name;
virQEMUCapsPtr flags;
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 65e9591..50eb318 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -18,6 +18,8 @@
# include "testutilsqemu.h"
# include "virstring.h"
+# define VIR_FROM_THIS VIR_FROM_NONE
+
static virQEMUDriver driver;
static int
diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c
index f4d119e..eafefda 100644
--- a/tests/sexpr2xmltest.c
+++ b/tests/sexpr2xmltest.c
@@ -14,6 +14,8 @@
#include "testutilsxen.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static virCapsPtr caps;
static int
diff --git a/tests/storagepoolxml2xmltest.c b/tests/storagepoolxml2xmltest.c
index 0376e63..53a7f83 100644
--- a/tests/storagepoolxml2xmltest.c
+++ b/tests/storagepoolxml2xmltest.c
@@ -14,6 +14,8 @@
#include "testutilsqemu.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static int
testCompareXMLToXMLFiles(const char *inxml, const char *outxml)
{
diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c
index 6a6c8e3..89c233f 100644
--- a/tests/storagevolxml2argvtest.c
+++ b/tests/storagevolxml2argvtest.c
@@ -7,6 +7,8 @@
#include "testutilsqemu.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
const char create_tool[] = "qemu-img";
static int
diff --git a/tests/storagevolxml2xmltest.c b/tests/storagevolxml2xmltest.c
index e87b016..05d2306 100644
--- a/tests/storagevolxml2xmltest.c
+++ b/tests/storagevolxml2xmltest.c
@@ -14,6 +14,8 @@
#include "testutilsqemu.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static int
testCompareXMLToXMLFiles(const char *poolxml, const char *inxml,
const char *outxml)
diff --git a/tests/sysinfotest.c b/tests/sysinfotest.c
index dc0451b..ba57a7a 100644
--- a/tests/sysinfotest.c
+++ b/tests/sysinfotest.c
@@ -36,6 +36,8 @@
#include "virfile.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
#if defined (__linux__)
# if defined(__s390__) || defined(__s390x__) || \
diff --git a/tests/virbuftest.c b/tests/virbuftest.c
index 3938f0d..febe6e4 100644
--- a/tests/virbuftest.c
+++ b/tests/virbuftest.c
@@ -10,6 +10,8 @@
#include "viralloc.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
#define TEST_ERROR(...) \
do { \
if (virTestGetDebug()) \
diff --git a/tests/virhashtest.c b/tests/virhashtest.c
index f36fc76..9b7fcbb 100644
--- a/tests/virhashtest.c
+++ b/tests/virhashtest.c
@@ -13,6 +13,8 @@
#include "virlog.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
#define testError(...) \
do { \
char *str; \
diff --git a/tests/virshtest.c b/tests/virshtest.c
index fad6774..ca35bb0 100644
--- a/tests/virshtest.c
+++ b/tests/virshtest.c
@@ -9,6 +9,8 @@
#include "testutils.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
#ifdef WIN32
int
diff --git a/tests/xencapstest.c b/tests/xencapstest.c
index 8bdd6cd..9de3919 100644
--- a/tests/xencapstest.c
+++ b/tests/xencapstest.c
@@ -12,6 +12,8 @@
#include "virfile.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static int
testCompareFiles(virArch hostmachine, const char *xml_rel,
const char *cpuinfo_rel, const char *capabilities_rel)
diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c
index ec196c4..87ac2c3 100644
--- a/tests/xml2sexprtest.c
+++ b/tests/xml2sexprtest.c
@@ -16,6 +16,8 @@
#include "testutilsxen.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static virCapsPtr caps;
static virDomainXMLOptionPtr xmlopt;
diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c
index c17c257..496324e 100644
--- a/tools/virt-host-validate-common.c
+++ b/tools/virt-host-validate-common.c
@@ -33,6 +33,8 @@
#include "virt-host-validate-common.h"
#include "virstring.h"
+#define VIR_FROM_THIS VIR_FROM_NONE
+
static bool quiet;
void virHostMsgSetQuiet(bool quietFlag)
--
1.8.1.5