diff options
Diffstat (limited to 'disk/part.c')
| -rw-r--r-- | disk/part.c | 69 | 
1 files changed, 67 insertions, 2 deletions
| diff --git a/disk/part.c b/disk/part.c index f659cc39c..f0afd8955 100644 --- a/disk/part.c +++ b/disk/part.c @@ -70,7 +70,7 @@ static const struct block_drvr block_drvr[] = {  DECLARE_GLOBAL_DATA_PTR; -block_dev_desc_t *get_dev(char* ifname, int dev) +block_dev_desc_t *get_dev(const char *ifname, int dev)  {  	const struct block_drvr *drvr = block_drvr;  	block_dev_desc_t* (*reloc_get_dev)(int dev); @@ -97,7 +97,7 @@ block_dev_desc_t *get_dev(char* ifname, int dev)  	return NULL;  }  #else -block_dev_desc_t *get_dev(char* ifname, int dev) +block_dev_desc_t *get_dev(const char *ifname, int dev)  {  	return NULL;  } @@ -288,6 +288,7 @@ void init_part (block_dev_desc_t * dev_desc)  	    return;  	}  #endif +	dev_desc->part_type = PART_TYPE_UNKNOWN;  } @@ -441,3 +442,67 @@ int get_partition_info(block_dev_desc_t *dev_desc, int part  	return -1;  } + +int get_device_and_partition(const char *ifname, const char *dev_str, +			     block_dev_desc_t **dev_desc, +			     disk_partition_t *info) +{ +	int ret; +	char *ep; +	int dev; +	block_dev_desc_t *desc; +	int part = 0; +	char *part_str; + +	if (dev_str) +		dev = simple_strtoul(dev_str, &ep, 16); + +	if (!dev_str || (dev_str == ep)) { +		dev_str = getenv("bootdevice"); +		if (dev_str) +			dev = simple_strtoul(dev_str, &ep, 16); +		if (!dev_str || (dev_str == ep)) +			goto err; +	} + +	desc = get_dev(ifname, dev); +	if (!desc || (desc->type == DEV_TYPE_UNKNOWN)) +		goto err; + +	if (desc->part_type == PART_TYPE_UNKNOWN) { +		/* disk doesn't use partition table */ +		if (!desc->lba) { +			printf("**Bad disk size - %s %d:0 **\n", ifname, dev); +			return -1; +		} +		info->start = 0; +		info->size = desc->lba; +		info->blksz = desc->blksz; + +		*dev_desc = desc; +		return 0; +	} + +	part_str = strchr(dev_str, ':'); +	if (part_str) +		part = (int)simple_strtoul(++part_str, NULL, 16); + +	ret = get_partition_info(desc, part, info); +	if (ret) { +		printf("** Invalid partition %d, use `dev[:part]' **\n", part); +		return -1; +	} +	if (strncmp((char *)info->type, BOOT_PART_TYPE, sizeof(info->type)) != 0) { +		printf("** Invalid partition type \"%.32s\"" +			" (expect \"" BOOT_PART_TYPE "\")\n", +			info->type); +		return -1; +	} + +	*dev_desc = desc; +	return part; + +err: +	puts("** Invalid boot device, use `dev[:part]' **\n"); +	return -1; +} |