cmd_part.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
  3. *
  4. * made from cmd_ext2, which was:
  5. *
  6. * (C) Copyright 2004
  7. * esd gmbh <www.esd-electronics.com>
  8. * Reinhard Arlt <reinhard.arlt@esd-electronics.com>
  9. *
  10. * made from cmd_reiserfs by
  11. *
  12. * (C) Copyright 2003 - 2004
  13. * Sysgo Real-Time Solutions, AG <www.elinos.com>
  14. * Pavel Bartusek <pba@sysgo.com>
  15. *
  16. * SPDX-License-Identifier: GPL-2.0+
  17. */
  18. #include <common.h>
  19. #include <config.h>
  20. #include <command.h>
  21. #include <part.h>
  22. #include <vsprintf.h>
  23. #ifndef CONFIG_PARTITION_UUIDS
  24. #error CONFIG_PARTITION_UUIDS must be enabled for CONFIG_CMD_PART to be enabled
  25. #endif
  26. static int do_part_uuid(int argc, char * const argv[])
  27. {
  28. int part;
  29. block_dev_desc_t *dev_desc;
  30. disk_partition_t info;
  31. if (argc < 2)
  32. return CMD_RET_USAGE;
  33. if (argc > 3)
  34. return CMD_RET_USAGE;
  35. part = get_device_and_partition(argv[0], argv[1], &dev_desc, &info, 0);
  36. if (part < 0)
  37. return 1;
  38. if (argc > 2)
  39. setenv(argv[2], info.uuid);
  40. else
  41. printf("%s\n", info.uuid);
  42. return 0;
  43. }
  44. static int do_part_list(int argc, char * const argv[])
  45. {
  46. int ret;
  47. block_dev_desc_t *desc;
  48. if (argc < 2 || argc > 3)
  49. return CMD_RET_USAGE;
  50. ret = get_device(argv[0], argv[1], &desc);
  51. if (ret < 0)
  52. return 1;
  53. if (argc == 3) {
  54. int p;
  55. char str[512] = { 0, };
  56. disk_partition_t info;
  57. for (p = 1; p < 128; p++) {
  58. int r = get_partition_info(desc, p, &info);
  59. if (r == 0) {
  60. char t[5];
  61. sprintf(t, "%s%d", str[0] ? " " : "", p);
  62. strcat(str, t);
  63. }
  64. }
  65. setenv(argv[2], str);
  66. return 0;
  67. }
  68. print_part(desc);
  69. return 0;
  70. }
  71. static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  72. {
  73. if (argc < 2)
  74. return CMD_RET_USAGE;
  75. if (!strcmp(argv[1], "uuid"))
  76. return do_part_uuid(argc - 2, argv + 2);
  77. else if (!strcmp(argv[1], "list"))
  78. return do_part_list(argc - 2, argv + 2);
  79. return CMD_RET_USAGE;
  80. }
  81. U_BOOT_CMD(
  82. part, 5, 1, do_part,
  83. "disk partition related commands",
  84. "part uuid <interface> <dev>:<part>\n"
  85. " - print partition UUID\n"
  86. "part uuid <interface> <dev>:<part> <varname>\n"
  87. " - set environment variable to partition UUID\n"
  88. "part list <interface> <dev>\n"
  89. " - print a device's partition table\n"
  90. "part list <interface> <dev> <varname>\n"
  91. " - set environment variable to the list of partitions"
  92. );