On 1/7/21 7:35 AM, Simon Glass wrote:
On Thu, 31 Dec 2020 at 15:49, Sean Anderson <sean.ander...@seco.com> wrote:

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.ander...@seco.com>
---

  disk/part.c | 32 +++++++++++++++++---------------
  1 file changed, 17 insertions(+), 15 deletions(-)

Reviewed-by: Simon Glass <s...@chromium.org>

Does the function comment need updating?

Yes. Will be updated.

--Sean




diff --git a/disk/part.c b/disk/part.c
index 39c6b00a59..e07dd67fd9 100644
--- a/disk/part.c
+++ b/disk/part.c
@@ -707,29 +707,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;
  }

--
2.25.1

Reply via email to