summaryrefslogtreecommitdiffstats
path: root/commands/cat.c
diff options
context:
space:
mode:
Diffstat (limited to 'commands/cat.c')
-rw-r--r--commands/cat.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/commands/cat.c b/commands/cat.c
new file mode 100644
index 0000000000..72baae2e5e
--- /dev/null
+++ b/commands/cat.c
@@ -0,0 +1,64 @@
+#include <common.h>
+#include <command.h>
+#include <fs.h>
+#include <linux/ctype.h>
+#include <errno.h>
+#include <xfuncs.h>
+#include <malloc.h>
+
+static int do_cat(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ int ret;
+ int fd, i;
+ char *buf;
+ int err = 0;
+ int args = 1;
+
+ if (argc < 2) {
+ perror("cat");
+ return 1;
+ }
+
+ buf = xmalloc(1024);
+
+ while (args < argc) {
+ fd = open(argv[args], 0);
+ if (fd < 0) {
+ printf("could not open %s: %s\n", argv[args], errno_str());
+ goto out;
+ }
+
+ while((ret = read(fd, buf, 1024)) > 0) {
+ for(i = 0; i < ret; i++) {
+ if (isprint(buf[i]) || buf[i] == '\n' || buf[i] == '\t')
+ putc(buf[i]);
+ else
+ putc('.');
+ }
+ if(ctrlc()) {
+ err = 1;
+ close(fd);
+ goto out;
+ }
+ }
+ close(fd);
+ args++;
+ }
+
+out:
+ free(buf);
+
+ return err;
+}
+
+static __maybe_unused char cmd_cat_help[] =
+"Usage: cat [FILES]\n"
+"Concatenate files on stdout. Currently only printable characters\n"
+"and \\n and \\t are printed, but this should be optional\n";
+
+U_BOOT_CMD_START(cat)
+ .maxargs = CONFIG_MAXARGS,
+ .cmd = do_cat,
+ .usage = "concatenate file(s)",
+ U_BOOT_CMD_HELP(cmd_cat_help)
+U_BOOT_CMD_END