static int pc98_probe (const PedDevice *dev) { PC98RawTable part_table; int empty; const PC98RawPartition* p; PED_ASSERT (dev != NULL); if (dev->sector_size != 512) return 0; if (!ped_device_read (dev, &part_table, 0, 2)) return 0; /* check magic */ if (!pc98_check_magic (&part_table)) return 0; /* check consistency */ empty = 1; for (p = part_table.partitions; p < part_table.partitions + MAX_PART_COUNT; p++) { if (p->mid == 0 && p->sid == 0) continue; empty = 0; if (!check_partition_consistency (dev, p)) return 0; } /* check boot loader */ if (pc98_check_ipl_signature (&part_table)) return 1; else if (part_table.boot_code[0]) /* invalid boot loader */ return 0; /* Not to mistake msdos disk map for PC-9800's empty disk map */ if (empty) return 0; return 1; }
static int pc98_probe (const PedDevice *dev) { PC98RawTable part_table; PED_ASSERT (dev != NULL); if (dev->sector_size != 512) return 0; if (!ped_device_read (dev, &part_table, 0, 2)) return 0; /* check magic */ if (!pc98_check_magic (&part_table)) return 0; /* check for boot loader signatures */ return pc98_check_ipl_signature (&part_table); }
static int read_table (PedDisk* disk) { int i; PC98RawTable table; PedConstraint* constraint_any; PED_ASSERT (disk != NULL); PED_ASSERT (disk->dev != NULL); constraint_any = ped_constraint_any (disk->dev); if (!ped_device_read (disk->dev, (void*) &table, 0, 2)) goto error; if (!pc98_check_magic(&table)) { if (ped_exception_throw ( PED_EXCEPTION_ERROR, PED_EXCEPTION_IGNORE_CANCEL, _("Invalid partition table on %s."), disk->dev->path)) goto error; } for (i = 0; i < MAX_PART_COUNT; i++) { PC98RawPartition* raw_part; PedPartition* part; PC98PartitionData* pc98_data; PedSector part_start; PedSector part_end; raw_part = &table.partitions [i]; if (is_unused_partition(raw_part)) continue; part_start = legacy_start (disk, raw_part); part_end = legacy_end (disk, raw_part); part = ped_partition_new (disk, PED_PARTITION_NORMAL, NULL, part_start, part_end); if (!part) goto error; pc98_data = part->disk_specific; PED_ASSERT (pc98_data != NULL); pc98_data->system = (raw_part->mid << 8) | raw_part->sid; pc98_data->boot = GET_BIT(raw_part->mid, 7); pc98_data->hidden = !GET_BIT(raw_part->sid, 7); ped_partition_set_name (part, raw_part->name); pc98_data->ipl_sector = chs_to_sector ( disk->dev, PED_LE16_TO_CPU(raw_part->ipl_cyl), raw_part->ipl_head, raw_part->ipl_sect); /* hack */ if (pc98_data->ipl_sector == part->geom.start) pc98_data->ipl_sector = 0; part->num = i + 1; if (!ped_disk_add_partition (disk, part, constraint_any)) goto error; if (part->geom.start != part_start || part->geom.end != part_end) { ped_exception_throw ( PED_EXCEPTION_NO_FEATURE, PED_EXCEPTION_CANCEL, _("Partition %d isn't aligned to cylinder " "boundaries. This is still unsupported."), part->num); goto error; } part->fs_type = ped_file_system_probe (&part->geom); } ped_constraint_destroy (constraint_any); return 1; error: ped_disk_delete_all (disk); ped_constraint_destroy (constraint_any); return 0; }