1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright 2022 4 * Roger Knecht <rknecht@pm.de> 5 */ 6 7#include <common.h> 8#include <command.h> 9#include <fs.h> 10#include <malloc.h> 11#include <mapmem.h> 12 13static int do_cat(struct cmd_tbl *cmdtp, int flag, int argc, 14 char *const argv[]) 15{ 16 char *ifname; 17 char *dev; 18 char *file; 19 char *buffer; 20 ulong file_size; 21 int ret; 22 23 if (argc < 4) 24 return CMD_RET_USAGE; 25 26 ifname = argv[1]; 27 dev = argv[2]; 28 file = argv[3]; 29 30 ret = fs_load_alloc(ifname, dev, file, 0, 0, (void **)&buffer, 31 &file_size); 32 33 // check file exists 34 switch (ret) { 35 case 0: 36 break; 37 case -ENOMEDIUM: 38 return CMD_RET_FAILURE; 39 case -ENOENT: 40 log_err("File does not exist: ifname=%s dev=%s file=%s\n", ifname, dev, file); 41 return CMD_RET_FAILURE; 42 case -E2BIG: 43 log_err("File is too large: ifname=%s dev=%s file=%s\n", ifname, dev, file); 44 return CMD_RET_FAILURE; 45 case -ENOMEM: 46 log_err("Not enough memory: ifname=%s dev=%s file=%s\n", ifname, dev, file); 47 return CMD_RET_FAILURE; 48 default: 49 case -EIO: 50 log_err("File-read failed: ifname=%s dev=%s file=%s\n", ifname, dev, file); 51 return CMD_RET_FAILURE; 52 } 53 54 // print file content 55 buffer[file_size] = '\0'; 56 puts(buffer); 57 58 free(buffer); 59 60 return 0; 61} 62 63U_BOOT_LONGHELP(cat, 64 "<interface> <dev[:part]> <file>\n" 65 " - Print file from 'dev' on 'interface' to standard output\n"); 66 67U_BOOT_CMD(cat, 4, 1, do_cat, 68 "Print file to standard output", 69 cat_help_text 70); 71