xxd.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2022
  4. * Roger Knecht <rknecht@pm.de>
  5. */
  6. #include <common.h>
  7. #include <command.h>
  8. #include <display_options.h>
  9. #include <fs.h>
  10. #include <malloc.h>
  11. #include <mapmem.h>
  12. static int do_xxd(struct cmd_tbl *cmdtp, int flag, int argc,
  13. char *const argv[])
  14. {
  15. char *ifname;
  16. char *dev;
  17. char *file;
  18. char *buffer;
  19. phys_addr_t addr;
  20. loff_t file_size;
  21. if (argc < 4)
  22. return CMD_RET_USAGE;
  23. ifname = argv[1];
  24. dev = argv[2];
  25. file = argv[3];
  26. // check file exists
  27. if (fs_set_blk_dev(ifname, dev, FS_TYPE_ANY))
  28. return CMD_RET_FAILURE;
  29. if (!fs_exists(file)) {
  30. log_err("File does not exist: ifname=%s dev=%s file=%s\n", ifname, dev, file);
  31. return CMD_RET_FAILURE;
  32. }
  33. // get file size
  34. if (fs_set_blk_dev(ifname, dev, FS_TYPE_ANY))
  35. return CMD_RET_FAILURE;
  36. if (fs_size(file, &file_size)) {
  37. log_err("Cannot read file size: ifname=%s dev=%s file=%s\n", ifname, dev, file);
  38. return CMD_RET_FAILURE;
  39. }
  40. // allocate memory for file content
  41. buffer = calloc(sizeof(char), file_size);
  42. if (!buffer) {
  43. log_err("Out of memory\n");
  44. return CMD_RET_FAILURE;
  45. }
  46. // map pointer to system memory
  47. addr = map_to_sysmem(buffer);
  48. // read file to memory
  49. if (fs_set_blk_dev(ifname, dev, FS_TYPE_ANY))
  50. return CMD_RET_FAILURE;
  51. if (fs_read(file, addr, 0, 0, &file_size)) {
  52. log_err("Cannot read file: ifname=%s dev=%s file=%s\n", ifname, dev, file);
  53. return CMD_RET_FAILURE;
  54. }
  55. // print file content
  56. print_buffer(0, buffer, sizeof(char), file_size, 0);
  57. free(buffer);
  58. return 0;
  59. }
  60. #ifdef CONFIG_SYS_LONGHELP
  61. static char xxd_help_text[] =
  62. "<interface> <dev[:part]> <file>\n"
  63. " - Print file from 'dev' on 'interface' as hexdump to standard output\n";
  64. #endif
  65. U_BOOT_CMD(xxd, 4, 1, do_xxd,
  66. "Print file as hexdump to standard output",
  67. xxd_help_text
  68. );