* 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list