]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
part: Support string block devices in part_get_info_by_dev_and_name
authorSean Anderson <sean.anderson@seco.com>
Fri, 5 Feb 2021 14:38:57 +0000 (09:38 -0500)
committerMarek Vasut <marex@denx.de>
Fri, 26 Feb 2021 14:30:55 +0000 (15:30 +0100)
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>
disk/part.c

index 03f283307f5a182ca55701e9241e56e9f154d8b1..80ced2ba88daa6d0e8f5c249e671fabc1a1fe920 100644 (file)
@@ -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;
 }