[PATCH 21/30] commands: echo: add wide file output via wecho alias

Ahmad Fatoum a.fatoum at pengutronix.de
Mon Nov 22 00:47:23 PST 2021


For interacting with EFI, it can be useful to write UCS-2 files from the
shell. Add an optional wecho alias to facilitate this.

Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
 commands/echo.c | 55 +++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 51 insertions(+), 4 deletions(-)

diff --git a/commands/echo.c b/commands/echo.c
index 99575b4c0c35..572b852ea32a 100644
--- a/commands/echo.c
+++ b/commands/echo.c
@@ -10,6 +10,40 @@
 #include <errno.h>
 #include <libbb.h>
 
+static void echo_dputc(int fd, char c, bool wide)
+{
+	wchar_t wc;
+	int n;
+
+	if (!wide || fd == 1 || fd == 2) {
+		dputc(fd, c);
+		return;
+	}
+
+	n = mbtowc(&wc, &c, 1);
+	if (n < 0)
+		return;
+
+	write(fd, &wc, sizeof(wchar_t));
+}
+
+static void echo_dputs(int fd, const char *s, bool wide)
+{
+	wchar_t *ws;
+
+	if (!wide || fd == 1 || fd == 2) {
+		dputs(fd, s);
+		return;
+	}
+
+	ws = strdup_char_to_wchar(s);
+	if (!ws)
+		return;
+
+	write(fd, ws, wcslen(ws) * sizeof(wchar_t));
+	free(ws);
+}
+
 static int do_echo(int argc, char *argv[])
 {
 	int i, optind = 1;
@@ -18,6 +52,10 @@ static int do_echo(int argc, char *argv[])
 	int oflags = O_WRONLY | O_CREAT;
 	char str[CONFIG_CBSIZE];
 	int process_escape = 0;
+	bool wide = false;
+
+	if (IS_ENABLED(CONFIG_PRINTF_WCHAR) && *argv[0] == 'w')
+		wide = true;
 
 	/* We can't use getopt() here because we want to
 	 * echo all things we don't understand.
@@ -66,18 +104,22 @@ exit_parse:
 	}
 
 	for (i = optind; i < argc; i++) {
+		const char *out;
+
 		if (i > optind)
-			dputc(fd, ' ');
+			echo_dputc(fd, ' ', wide);
 		if (process_escape) {
 			process_escape_sequence(argv[i], str, CONFIG_CBSIZE);
-			dputs(fd, str);
+			out = str;
 		} else {
-			dputs(fd, argv[i]);
+			out = argv[i];
 		}
+
+		echo_dputs(fd, out, wide);
 	}
 
 	if (newline)
-		dputc(fd, '\n');
+		echo_dputc(fd, '\n', wide);
 
 	if (file)
 		close(fd);
@@ -99,8 +141,13 @@ BAREBOX_CMD_HELP_OPT ("-a FILE", "append to FILE instead of using stdout")
 BAREBOX_CMD_HELP_OPT ("-o FILE", "overwrite FILE instead of using stdout")
 BAREBOX_CMD_HELP_END
 
+static __maybe_unused const char * const echo_aliases[] = { "wecho", NULL};
+
 BAREBOX_CMD_START(echo)
 	.cmd		= do_echo,
+#ifdef CONFIG_PRINTF_WCHAR
+	.aliases	= echo_aliases,
+#endif
 	BAREBOX_CMD_DESC("echo args to console")
 	BAREBOX_CMD_OPTS("[-neao] STRING")
 	BAREBOX_CMD_GROUP(CMD_GRP_CONSOLE)
-- 
2.30.2




More information about the barebox mailing list