virsh: fflush(stdout) after fputs()

We are not guaranteed that the string we are printing onto stdout
contains '\n' and thus that the stdout is flushed. In fact, I've
met this problem when virsh asked me whether I want to edit the
domain XML again (vshAskReedit()) but the prompt wasn't displayed
(as it does not contain a newline character) and virsh just sat
there waiting for my input, I sat there waiting for virsh's
output. Flush stdout after all fputs()-s  which do not flush
stdout.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Michal Privoznik 2022-03-09 14:01:49 +01:00
parent a5e659f071
commit 79c613ec8a

View File

@ -1863,6 +1863,7 @@ vshDebug(vshControl *ctl, int level, const char *format, ...)
str = g_strdup_vprintf(format, ap); str = g_strdup_vprintf(format, ap);
va_end(ap); va_end(ap);
fputs(str, stdout); fputs(str, stdout);
fflush(stdout);
} }
void void
@ -1878,6 +1879,7 @@ vshPrintExtra(vshControl *ctl, const char *format, ...)
str = g_strdup_vprintf(format, ap); str = g_strdup_vprintf(format, ap);
va_end(ap); va_end(ap);
fputs(str, stdout); fputs(str, stdout);
fflush(stdout);
} }
@ -1891,6 +1893,7 @@ vshPrint(vshControl *ctl G_GNUC_UNUSED, const char *format, ...)
str = g_strdup_vprintf(format, ap); str = g_strdup_vprintf(format, ap);
va_end(ap); va_end(ap);
fputs(str, stdout); fputs(str, stdout);
fflush(stdout);
} }
@ -2938,6 +2941,7 @@ vshReadline(vshControl *ctl G_GNUC_UNUSED,
int len; int len;
fputs(prompt, stdout); fputs(prompt, stdout);
fflush(stdout);
r = fgets(line, sizeof(line), stdin); r = fgets(line, sizeof(line), stdin);
if (r == NULL) return NULL; /* EOF */ if (r == NULL) return NULL; /* EOF */