Put multiple values for an option if followed by another option as used
in certain iptables arguments.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/util/vircommand.c | 29 +++++++++++++++++++++++------
tests/commanddata/test26.log | 2 +-
tests/commandtest.c | 5 ++++-
3 files changed, 28 insertions(+), 8 deletions(-)
diff --git a/src/util/vircommand.c b/src/util/vircommand.c
index 3eb4f3a6d5..16bd331b53 100644
--- a/src/util/vircommand.c
+++ b/src/util/vircommand.c
@@ -2076,9 +2076,9 @@ virCommandToStringFull(virCommandPtr cmd,
{
size_t i;
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
- bool prevopt = false;
const char *command = cmd->args[0];
g_autofree char *basename = NULL;
+ bool had_option = false;
/* Cannot assume virCommandRun will be called; so report the error
* now. If virCommandRun is called, it will report the same error. */
@@ -2111,16 +2111,33 @@ virCommandToStringFull(virCommandPtr cmd,
virBufferEscapeShell(&buf, command);
for (i = 1; i < cmd->nargs; i++) {
virBufferAddChar(&buf, ' ');
+
if (linebreaks) {
- /* Line break if this is a --arg or if
- * the previous arg was a positional option
+ /* we don't want a linebreak only if
+ * - the previous argument is an option (starts with '-')
+ * - there was already an option and another option follows
*/
- if (cmd->args[i][0] == '-' ||
- !prevopt)
+ bool linebreak = true;
+
+ if (cmd->args[i][0] != '-') {
+ if (had_option) {
+ size_t j;
+ /* we know that arg[i - 1] is valid and arg[i] is not an option */
+ for (j = i - 1; j < cmd->nargs; j++) {
+ if (cmd->args[j][0] == '-') {
+ linebreak = false;
+ break;
+ }
+ }
+ }
+ } else {
+ had_option = true;
+ }
+
+ if (linebreak)
virBufferAddLit(&buf, "\\\n");
}
virBufferEscapeShell(&buf, cmd->args[i]);
- prevopt = (cmd->args[i][0] == '-');
}
return virBufferContentAndReset(&buf);
diff --git a/tests/commanddata/test26.log b/tests/commanddata/test26.log
index db0d424875..72dd1af5a8 100644
--- a/tests/commanddata/test26.log
+++ b/tests/commanddata/test26.log
@@ -1 +1 @@
-A=B C=D E true --foo bar --oooh -f --wizz eek eek -w -z -l --mmm flash bang wallop
+A=B C=D E true --foo bar --oooh -f --wizz eek eek --m-m-m-multiarg arg arg2 -w -z -l
--mmm flash bang wallop
diff --git a/tests/commandtest.c b/tests/commandtest.c
index aaf391935c..81e9914860 100644
--- a/tests/commandtest.c
+++ b/tests/commandtest.c
@@ -997,6 +997,7 @@ static int test26(const void *unused G_GNUC_UNUSED)
"--oooh \\\n"
"-f \\\n"
"--wizz 'eek eek' \\\n"
+ "--m-m-m-multiarg arg arg2 \\\n"
"-w \\\n"
"-z \\\n"
"-l \\\n"
@@ -1009,7 +1010,9 @@ static int test26(const void *unused G_GNUC_UNUSED)
virCommandAddEnvPair(cmd, "A", "B");
virCommandAddEnvPair(cmd, "C", "D E");
virCommandAddArgList(cmd, "--foo", "bar", "--oooh",
"-f",
- "--wizz", "eek eek", "-w",
"-z", "-l",
+ "--wizz", "eek eek",
+ "--m-m-m-multiarg", "arg",
"arg2",
+ "-w", "-z", "-l",
"--mmm", "flash", "bang",
"wallop",
NULL);
--
2.30.2