summaryrefslogtreecommitdiff
path: root/cmd/cat.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/cat.c')
-rw-r--r--cmd/cat.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/cmd/cat.c b/cmd/cat.c
new file mode 100644
index 00000000000..6828b7b364e
--- /dev/null
+++ b/cmd/cat.c
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2022
+ * Roger Knecht <rknecht@pm.de>
+ */
+
+#include <command.h>
+#include <fs.h>
+#include <malloc.h>
+#include <mapmem.h>
+
+static int do_cat(struct cmd_tbl *cmdtp, int flag, int argc,
+ char *const argv[])
+{
+ char *ifname;
+ char *dev;
+ char *file;
+ char *buffer;
+ ulong file_size;
+ int ret;
+
+ if (argc < 4)
+ return CMD_RET_USAGE;
+
+ ifname = argv[1];
+ dev = argv[2];
+ file = argv[3];
+
+ ret = fs_load_alloc(ifname, dev, file, 0, 0, (void **)&buffer,
+ &file_size);
+
+ // check file exists
+ switch (ret) {
+ case 0:
+ break;
+ case -ENOMEDIUM:
+ return CMD_RET_FAILURE;
+ case -ENOENT:
+ log_err("File does not exist: ifname=%s dev=%s file=%s\n", ifname, dev, file);
+ return CMD_RET_FAILURE;
+ case -E2BIG:
+ log_err("File is too large: ifname=%s dev=%s file=%s\n", ifname, dev, file);
+ return CMD_RET_FAILURE;
+ case -ENOMEM:
+ log_err("Not enough memory: ifname=%s dev=%s file=%s\n", ifname, dev, file);
+ return CMD_RET_FAILURE;
+ default:
+ case -EIO:
+ log_err("File-read failed: ifname=%s dev=%s file=%s\n", ifname, dev, file);
+ return CMD_RET_FAILURE;
+ }
+
+ // print file content
+ buffer[file_size] = '\0';
+ puts(buffer);
+
+ free(buffer);
+
+ return 0;
+}
+
+U_BOOT_LONGHELP(cat,
+ "<interface> <dev[:part]> <file>\n"
+ " - Print file from 'dev' on 'interface' to standard output\n");
+
+U_BOOT_CMD(cat, 4, 1, do_cat,
+ "Print file to standard output",
+ cat_help_text
+);