summaryrefslogtreecommitdiffstats
path: root/commands/echo.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2007-07-05 18:02:13 +0200
committerSascha Hauer <sha@octopus.labnet.pengutronix.de>2007-07-05 18:02:13 +0200
commit4b07af6730d2811363f158f5175138116038f7b9 (patch)
tree206044270884f80204a2da69e02ca3b6f5803185 /commands/echo.c
parentd08c60e9d77dc0f83946cd702d383451865e66dd (diff)
downloadbarebox-4b07af6730d2811363f158f5175138116038f7b9.tar.gz
barebox-4b07af6730d2811363f158f5175138116038f7b9.tar.xz
svn_rev_643
structure cleanup
Diffstat (limited to 'commands/echo.c')
-rw-r--r--commands/echo.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/commands/echo.c b/commands/echo.c
new file mode 100644
index 0000000000..1314f2d971
--- /dev/null
+++ b/commands/echo.c
@@ -0,0 +1,82 @@
+#include <common.h>
+#include <command.h>
+#include <fs.h>
+#include <fcntl.h>
+#include <errno.h>
+
+static int do_echo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ int i, optind = 1;
+ int fd = stdout, opt, newline = 1;
+ char *file = NULL;
+ int oflags = O_WRONLY | O_CREAT;
+
+ /* We can't use getopt() here because we want to
+ * echo all things we don't understand.
+ */
+ while (optind < argc && *argv[optind] == '-') {
+ if (!*(argv[optind] + 1) || *(argv[optind] + 2))
+ break;
+
+ opt = *(argv[optind] + 1);
+ switch (opt) {
+ case 'n':
+ newline = 0;
+ break;
+ case 'a':
+ oflags |= O_APPEND;
+ if (optind + 1 < argc)
+ file = argv[optind + 1];
+ else
+ goto no_optarg_out;
+ optind++;
+ break;
+ case 'o':
+ oflags |= O_TRUNC;
+ file = argv[optind + 1];
+ if (optind + 1 < argc)
+ file = argv[optind + 1];
+ else
+ goto no_optarg_out;
+ optind++;
+ break;
+ default:
+ goto exit_parse;
+ }
+ optind++;
+ }
+
+exit_parse:
+ if (file) {
+ fd = open(file, oflags);
+ if (fd < 0) {
+ perror("open");
+ return 1;
+ }
+ }
+
+ for (i = optind; i < argc; i++) {
+ if (i > optind)
+ fputc(fd, ' ');
+ fputs(fd, argv[i]);
+ }
+
+ if (newline)
+ fputc(fd, '\n');
+
+ if (file)
+ close(fd);
+
+ return 0;
+
+no_optarg_out:
+ printf("option requires an argument -- %c\n", opt);
+ return 1;
+}
+
+U_BOOT_CMD_START(echo)
+ .maxargs = CONFIG_MAXARGS,
+ .cmd = do_echo,
+ .usage = "echo args to console",
+U_BOOT_CMD_END
+