summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Anderson <sean.anderson@seco.com>2021-02-05 17:38:57 +0300
committerMarek Vasut <marex@denx.de>2021-02-26 17:30:55 +0300
commit81c1aa89e17a73a899e0e55a3459f236909f2baf (patch)
tree675e808a431c47b519a0dff3cec36e5aac456a81
parent9f7bb2825b81680c0bc3cb4b0376e6a230501242 (diff)
downloadu-boot-81c1aa89e17a73a899e0e55a3459f236909f2baf.tar.xz
part: Support string block devices in part_get_info_by_dev_and_name
This adds support for things like "#partname" and "0.1#partname". The block device parsing is done like in blk_get_device_part_str. Signed-off-by: Sean Anderson <sean.anderson@seco.com> Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--disk/part.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/disk/part.c b/disk/part.c
index 03f283307f..80ced2ba88 100644
--- a/disk/part.c
+++ b/disk/part.c
@@ -693,12 +693,13 @@ int part_get_info_by_name(struct blk_desc *dev_desc, const char *name,
* Get partition info from device number and partition name.
*
* Parse a device number and partition name string in the form of
- * "device_num#partition_name", for example "0#misc". If the partition
- * is found, sets dev_desc and part_info accordingly with the information
- * of the partition with the given partition_name.
+ * "devicenum.hwpartnum#partition_name", for example "0.1#misc". devicenum and
+ * hwpartnum are both optional, defaulting to 0. If the partition is found,
+ * sets dev_desc and part_info accordingly with the information of the
+ * partition with the given partition_name.
*
* @param[in] dev_iface Device interface
- * @param[in] dev_part_str Input string argument, like "0#misc"
+ * @param[in] dev_part_str Input string argument, like "0.1#misc"
* @param[out] dev_desc Place to store the device description pointer
* @param[out] part_info Place to store the partition information
* @return 0 on success, or a negative on error
@@ -708,29 +709,31 @@ static int part_get_info_by_dev_and_name(const char *dev_iface,
struct blk_desc **dev_desc,
struct disk_partition *part_info)
{
- char *ep;
- const char *part_str;
- int dev_num, ret;
+ char *dup_str = NULL;
+ const char *dev_str, *part_str;
+ int ret;
+ /* Separate device and partition name specification */
part_str = strchr(dev_part_str, '#');
- if (!part_str || part_str == dev_part_str)
- return -EINVAL;
-
- dev_num = simple_strtoul(dev_part_str, &ep, 16);
- if (ep != part_str) {
- /* Not all the first part before the # was parsed. */
+ if (part_str) {
+ dup_str = strdup(dev_part_str);
+ dup_str[part_str - dev_part_str] = 0;
+ dev_str = dup_str;
+ part_str++;
+ } else {
return -EINVAL;
}
- part_str++;
- *dev_desc = blk_get_dev(dev_iface, dev_num);
- if (!*dev_desc) {
- printf("Could not find %s %d\n", dev_iface, dev_num);
- return -ENODEV;
- }
+ ret = blk_get_device_by_str(dev_iface, dev_str, dev_desc);
+ if (ret)
+ goto cleanup;
+
ret = part_get_info_by_name(*dev_desc, part_str, part_info);
if (ret < 0)
printf("Could not find \"%s\" partition\n", part_str);
+
+cleanup:
+ free(dup_str);
return ret;
}