Example #1
0
static bool_t msdos_partition(struct disk_t * disk, size_t sector, size_t relative)
{
	struct msdos_partition_mbr_t mbr;
	struct partition_t * part;
	size_t start;
	int i;

	if(!disk || !disk->name)
		return FALSE;

	if(!disk->size || !disk->count)
		return FALSE;

	if(disk_read(disk, (u8_t *)(&mbr), sector * disk->size, sizeof(struct msdos_partition_mbr_t)) != sizeof(struct msdos_partition_mbr_t))
		return FALSE;

	if((mbr.signature[0] != 0x55) || mbr.signature[1] != 0xaa)
		return FALSE;

	for(i = 0; i < 4; i++)
	{
		if((mbr.entry[i].type != 0) && (is_msdos_extended(mbr.entry[i].type)==FALSE))
		{
			part = malloc(sizeof(struct partition_t));
			if(!part)
				return FALSE;

			strlcpy(part->name, "", sizeof(part->name));
			part->from = sector + ((mbr.entry[i].start[3] << 24) | (mbr.entry[i].start[2] << 16) | (mbr.entry[i].start[1] << 8) | (mbr.entry[i].start[0] << 0));
			part->to = part->from + ((mbr.entry[i].length[3] << 24) | (mbr.entry[i].length[2] << 16) | (mbr.entry[i].length[1] << 8) | (mbr.entry[i].length[0] << 0)) - 1;
			part->size = disk->size;
			list_add_tail(&part->entry, &(disk->part.entry));
		}
	}

	for(i = 0; i < 4; i++)
	{
		if(is_msdos_extended(mbr.entry[i].type) == TRUE)
		{
			start = ((mbr.entry[i].start[3] << 24) | (mbr.entry[i].start[2] << 16) | (mbr.entry[i].start[1] << 8) | (mbr.entry[i].start[0] << 0)) + relative;
			return msdos_partition(disk, start, (sector == 0) ? start : relative);
		}
	}

	return TRUE;
}
Example #2
0
static void check_partition(struct gendisk *hd, kdev_t dev)
{
	static int first_time = 1;
	unsigned long first_sector;
	char buf[8];

	if (first_time)
		printk("Partition check:\n");
	first_time = 0;
	first_sector = hd->part[MINOR(dev)].start_sect;

	/*
	 * This is a kludge to allow the partition check to be
	 * skipped for specific drives (e.g. IDE cd-rom drives)
	 */
	if ((int)first_sector == -1) {
		hd->part[MINOR(dev)].start_sect = 0;
		return;
	}

	printk(" %s:", disk_name(hd, MINOR(dev), buf));
#ifdef CONFIG_MSDOS_PARTITION
	if (msdos_partition(hd, dev, first_sector))
		return;
#endif
#ifdef CONFIG_OSF_PARTITION
	if (osf_partition(hd, dev, first_sector))
		return;
#endif
#ifdef CONFIG_SUN_PARTITION
	if(sun_partition(hd, dev, first_sector))
		return;
#endif
#ifdef CONFIG_AMIGA_PARTITION
	if(amiga_partition(hd, dev, first_sector))
		return;
#endif
	printk(" unknown partition table\n");
}
Example #3
0
static bool_t msdos_map(struct disk_t * disk)
{
	return msdos_partition(disk, 0, 0);
}