* tools/virsh.c (vshPrint): Change redirect.
(vshPrintExtra): Allow use within vshPrint. Avoid fprintf on
arbitrary formats, since we aren't using gnulib module; instead,
use virVasprintf to pre-format.
(vshError): Likewise.
Reported by Matthias Bolte.
---
This passed for my fedora->mingw cross compile, but I'd like to
make sure it worked for your native mingw build setup.
tools/virsh.c | 21 ++++++++++++++++-----
1 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index 6d9861f..c2d165d 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -325,7 +325,7 @@ static void vshDebug(vshControl *ctl, int level, const char *format,
...)
ATTRIBUTE_FMT_PRINTF(3, 4);
/* XXX: add batch support */
-#define vshPrint(_ctl, ...) fprintf(stdout, __VA_ARGS__)
+#define vshPrint(_ctl, ...) vshPrintExtra(NULL, __VA_ARGS__)
static const char *vshDomainStateToString(int state);
static const char *vshDomainVcpuStateToString(int state);
@@ -11574,13 +11574,20 @@ static void
vshPrintExtra(vshControl *ctl, const char *format, ...)
{
va_list ap;
+ char *str;
- if (ctl->quiet == TRUE)
+ if (ctl && ctl->quiet == TRUE)
return;
va_start(ap, format);
- vfprintf(stdout, format, ap);
+ if (virVasprintf(&str, format, ap) < 0) {
+ vshError(ctl, "%s", _("Out of memory"));
+ va_end(ap);
+ return;
+ }
va_end(ap);
+ fprintf(stdout, "%s", str);
+ VIR_FREE(str);
}
@@ -11588,6 +11595,7 @@ static void
vshError(vshControl *ctl, const char *format, ...)
{
va_list ap;
+ char *str;
if (ctl != NULL) {
va_start(ap, format);
@@ -11598,10 +11606,13 @@ vshError(vshControl *ctl, const char *format, ...)
fputs(_("error: "), stderr);
va_start(ap, format);
- vfprintf(stderr, format, ap);
+ /* We can't recursively call vshError on an OOM situation, so ignore
+ failure here. */
+ ignore_value(virVasprintf(&str, format, ap));
va_end(ap);
- fputc('\n', stderr);
+ fprintf(stderr, "%s\n", NULLSTR(str));
+ VIR_FREE(str);
}
/*
--
1.7.4