You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.1 KiB
74 lines
2.1 KiB
/*
|
|
* Copyright (C) 2017 The Android Open Source Project
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <android_cmds.h>
|
|
|
|
#include <common.h>
|
|
#include <part.h>
|
|
|
|
/**
|
|
* part_get_info_by_dev_and_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.
|
|
*
|
|
* @dev_iface: Device interface.
|
|
* @dev_part_str: Input string argument, like "0;misc".
|
|
* @dev_desc: Place to store the device description pointer.
|
|
* @part_info: Place to store the partition information.
|
|
* @return 0 on success, or -1 on error
|
|
*/
|
|
static int 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)
|
|
{
|
|
char *ep;
|
|
const char *part_str;
|
|
int dev_num;
|
|
|
|
part_str = strchr(dev_part_str, ';');
|
|
if (!part_str || part_str == dev_part_str)
|
|
return -1;
|
|
|
|
dev_num = simple_strtoul(dev_part_str, &ep, 16);
|
|
if (ep != part_str) {
|
|
/* Not all the first part before the ; was parsed. */
|
|
return -1;
|
|
}
|
|
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 -1;
|
|
}
|
|
if (part_get_info_by_name(*dev_desc, part_str, part_info) < 0) {
|
|
printf("Could not find \"%s\" partition\n", part_str);
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int 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) {
|
|
/* Split the part_name if passed as "$dev_num;part_name". */
|
|
if (!part_get_info_by_dev_and_name(dev_iface, dev_part_str,
|
|
dev_desc, part_info))
|
|
return 0;
|
|
/* Couldn't lookup by name, try looking up the partition description
|
|
* directly.
|
|
*/
|
|
if (blk_get_device_part_str(dev_iface, dev_part_str,
|
|
dev_desc, part_info, 1) < 0) {
|
|
printf("Couldn't find partition %s %s\n",
|
|
dev_iface, dev_part_str);
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|