subprocess: Log subprocess arguments when running

Utility programs in vboot sometimes use subprocess_run to execute
another program like flashrom or cbfstool. This change makes it easier
to debug these utilities by logging executed subprocess and its
arguments.

This change also fixes futility vb2ex_printf() implementation.
Previously use of VB2_DEBUG_RAW() calling vb2ex_printf(NULL, ...) was
unnecessarily trying to print NULL as function name, which was not
intended behavior.

TEST=sign image and look for "Run: cbfstool ..."
BUG=none
BRANCH=none

Signed-off-by: Jakub Czapiga <czapiga@google.com>
Change-Id: I613d4af4af4370425cbbedc2d7de29a488533c6a
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/3878593
Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
Reviewed-by: Yu-Ping Wu <yupingso@chromium.org>
diff --git a/futility/misc.c b/futility/misc.c
index 874039f..7d261c2 100644
--- a/futility/misc.c
+++ b/futility/misc.c
@@ -39,7 +39,8 @@
 
 	va_list ap;
 	va_start(ap, format);
-	fprintf(stderr, "DEBUG: %s: ", func);
+	if (func)
+		fprintf(stderr, "DEBUG: %s: ", func);
 	vfprintf(stderr, format, ap);
 	va_end(ap);
 }
diff --git a/host/lib/cbfstool.c b/host/lib/cbfstool.c
index 8f54706..9f09d13 100644
--- a/host/lib/cbfstool.c
+++ b/host/lib/cbfstool.c
@@ -43,8 +43,6 @@
 		cbfstool, file, "truncate", "-r", region, NULL,
 	};
 
-	VB2_DEBUG("Calling: %s '%s' truncate -r '%s'\n", cbfstool, file,
-		  region);
 	status = subprocess_run(argv, &subprocess_null, &output,
 				&subprocess_null);
 
diff --git a/host/lib/subprocess.c b/host/lib/subprocess.c
index 242b189..8905d1c 100644
--- a/host/lib/subprocess.c
+++ b/host/lib/subprocess.c
@@ -5,6 +5,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/wait.h>
@@ -248,6 +249,28 @@
 	return rv;
 }
 
+static bool contains_spaces(const char *s)
+{
+	for (size_t i = 0; s[i]; i++) {
+		if (isspace(s[i]))
+			return true;
+	}
+	return false;
+}
+
+static void subprocess_log_call(const char *const argv[])
+{
+	VB2_DEBUG("Run:");
+
+	for (size_t i = 0; argv[i]; i++) {
+		if (contains_spaces(argv[i]))
+			VB2_DEBUG_RAW(" '%s'", argv[i]);
+		else
+			VB2_DEBUG_RAW(" %s", argv[i]);
+	}
+	VB2_DEBUG_RAW("\n");
+}
+
 struct subprocess_target subprocess_null = {
 	.type = TARGET_NULL,
 };
@@ -275,6 +298,8 @@
 	int status;
 	pid_t pid = -1;
 
+	subprocess_log_call(argv);
+
 	if (!input)
 		input = &subprocess_stdin;
 	if (!output)