1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2017 The Android Open Source Project
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: BSD-2-Clause
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include <android_cmds.h>
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <part.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun /**
13*4882a593Smuzhiyun * part_get_info_by_dev_and_name - Parse a device number and partition name
14*4882a593Smuzhiyun * string in the form of "device_num;partition_name", for example "0;misc".
15*4882a593Smuzhiyun * If the partition is found, sets dev_desc and part_info accordingly with the
16*4882a593Smuzhiyun * information of the partition with the given partition_name.
17*4882a593Smuzhiyun *
18*4882a593Smuzhiyun * @dev_iface: Device interface.
19*4882a593Smuzhiyun * @dev_part_str: Input string argument, like "0;misc".
20*4882a593Smuzhiyun * @dev_desc: Place to store the device description pointer.
21*4882a593Smuzhiyun * @part_info: Place to store the partition information.
22*4882a593Smuzhiyun * @return 0 on success, or -1 on error
23*4882a593Smuzhiyun */
part_get_info_by_dev_and_name(const char * dev_iface,const char * dev_part_str,struct blk_desc ** dev_desc,disk_partition_t * part_info)24*4882a593Smuzhiyun static int part_get_info_by_dev_and_name(const char *dev_iface,
25*4882a593Smuzhiyun const char *dev_part_str,
26*4882a593Smuzhiyun struct blk_desc **dev_desc,
27*4882a593Smuzhiyun disk_partition_t *part_info)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun char *ep;
30*4882a593Smuzhiyun const char *part_str;
31*4882a593Smuzhiyun int dev_num;
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun part_str = strchr(dev_part_str, ';');
34*4882a593Smuzhiyun if (!part_str || part_str == dev_part_str)
35*4882a593Smuzhiyun return -1;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun dev_num = simple_strtoul(dev_part_str, &ep, 16);
38*4882a593Smuzhiyun if (ep != part_str) {
39*4882a593Smuzhiyun /* Not all the first part before the ; was parsed. */
40*4882a593Smuzhiyun return -1;
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun part_str++;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun *dev_desc = blk_get_dev(dev_iface, dev_num);
45*4882a593Smuzhiyun if (!*dev_desc) {
46*4882a593Smuzhiyun printf("Could not find %s %d\n", dev_iface, dev_num);
47*4882a593Smuzhiyun return -1;
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun if (part_get_info_by_name(*dev_desc, part_str, part_info) < 0) {
50*4882a593Smuzhiyun printf("Could not find \"%s\" partition\n", part_str);
51*4882a593Smuzhiyun return -1;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun return 0;
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun
part_get_info_by_dev_and_name_or_num(const char * dev_iface,const char * dev_part_str,struct blk_desc ** dev_desc,disk_partition_t * part_info)56*4882a593Smuzhiyun int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
57*4882a593Smuzhiyun const char *dev_part_str,
58*4882a593Smuzhiyun struct blk_desc **dev_desc,
59*4882a593Smuzhiyun disk_partition_t *part_info) {
60*4882a593Smuzhiyun /* Split the part_name if passed as "$dev_num;part_name". */
61*4882a593Smuzhiyun if (!part_get_info_by_dev_and_name(dev_iface, dev_part_str,
62*4882a593Smuzhiyun dev_desc, part_info))
63*4882a593Smuzhiyun return 0;
64*4882a593Smuzhiyun /* Couldn't lookup by name, try looking up the partition description
65*4882a593Smuzhiyun * directly.
66*4882a593Smuzhiyun */
67*4882a593Smuzhiyun if (blk_get_device_part_str(dev_iface, dev_part_str,
68*4882a593Smuzhiyun dev_desc, part_info, 1) < 0) {
69*4882a593Smuzhiyun printf("Couldn't find partition %s %s\n",
70*4882a593Smuzhiyun dev_iface, dev_part_str);
71*4882a593Smuzhiyun return -1;
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun return 0;
74*4882a593Smuzhiyun }
75