From 2efb42e9ac22b3cd226c72c6b8324c31cbdf37ba Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Sat, 23 Mar 2019 19:02:13 -0500 Subject: [PATCH] virsh: Add 'echo --err' option Since test:///default resets state on every connection, writing a test that covers a sequence of commands must be done from a single session. But if the test wants to exercise particular failure modes as well as successes, it can be nice to leave witnesses in the stderr stream immediately before and after the spot where the expected error should be, to ensure the rest of the script is not causing errors. Do this by adding an --err option. Signed-off-by: Eric Blake Acked-by: Michal Privoznik --- tools/virsh.pod | 4 +++- tools/vsh.c | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/tools/virsh.pod b/tools/virsh.pod index 95cab7b57d..c4ff0c745a 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -623,12 +623,14 @@ the usable CPU models are only limited by the hypervisor. This command will print that all CPU models are accepted for these architectures and the actual list of supported CPU models can be checked in the domain capabilities XML. -=item B [I<--shell>] [I<--xml>] [I...] +=item B [I<--shell>] [I<--xml>] [I...] [I...] Echo back each I, separated by space. If I<--shell> is specified, then the output will be single-quoted where needed, so that it is suitable for reuse in a shell context. If I<--xml> is specified, then the output will be escaped for use in XML. +If I<--err> is specified, prefix B<"error: "> and output to stderr +instead of stdout. =item B I [I] [I] [I] [I] [I<--error>] diff --git a/tools/vsh.c b/tools/vsh.c index d90ce8d102..65b96f87d5 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -3296,6 +3296,10 @@ const vshCmdOptDef opts_echo[] = { .type = VSH_OT_BOOL, .help = N_("escape for XML use") }, + {.name = "err", + .type = VSH_OT_BOOL, + .help = N_("output to stderr"), + }, {.name = "str", .type = VSH_OT_ALIAS, .help = "string" @@ -3329,6 +3333,7 @@ cmdEcho(vshControl *ctl, const vshCmd *cmd) { bool shell = false; bool xml = false; + bool err = false; int count = 0; const vshCmdOpt *opt = NULL; char *arg; @@ -3338,6 +3343,8 @@ cmdEcho(vshControl *ctl, const vshCmd *cmd) shell = true; if (vshCommandOptBool(cmd, "xml")) xml = true; + if (vshCommandOptBool(cmd, "err")) + err = true; while ((opt = vshCommandOptArgv(ctl, cmd, opt))) { char *str; @@ -3372,8 +3379,12 @@ cmdEcho(vshControl *ctl, const vshCmd *cmd) return false; } arg = virBufferContentAndReset(&buf); - if (arg) - vshPrint(ctl, "%s", arg); + if (arg) { + if (err) + vshError(ctl, "%s", arg); + else + vshPrint(ctl, "%s", arg); + } VIR_FREE(arg); return true; } -- 2.47.2