#include "project.h" void sync_tables (DISK * d) { MBR *m; uint8_t mbuf[512]; GPT_headers h; int i; GUID guid_ext3 = GUID_TYPE_LINUX_EXT3; GUID guid_swap = GUID_TYPE_LINUX_SWAP; GUID guid_hfs = GUID_TYPE_APPLE_HFS; GUID guid_efi = GUID_TYPE_SYSTEM; GUID guid_new_ext3 = GUID_TYPE_NEW_LINUX_EXT3; GUID guid_raid = GUID_TYPE_LINUX_RAID; GUID guid_lvm = GUID_TYPE_LINUX_LVM; int mbr_entry = 0; int seen_linux = 0; disk_read (d, mbuf, 0, 1); m = (MBR *) mbuf; h = headers_get (d); for (i = 0; i < h.header.n_partition_entries; ++i) { GPT_entry e = entry_read (d, &h.header, i); uint8_t type = 0, bootable = 0; if (e.start >= 2147483648U) continue; if (e.end >= 2147483648U) continue; if (!guid_cmp (&e.type, &guid_efi)) { type = MBR_PARTITION_TYPE_EFI; } else if (!guid_cmp (&e.type, &guid_ext3) || !guid_cmp (&e.type, &guid_new_ext3)) { type = MBR_PARTITION_TYPE_LINUX; } else if (!guid_cmp (&e.type, &guid_raid)) { type = MBR_PARTITION_TYPE_RAID; } else if (!guid_cmp (&e.type, &guid_lvm)) { type = MBR_PARTITION_TYPE_LVM; } else if (!guid_cmp (&e.type, &guid_ext3)) { type = MBR_PARTITION_TYPE_LINUX; } else if (!guid_cmp (&e.type, &guid_swap)) { type = MBR_PARTITION_TYPE_SWAP; } else if (!guid_cmp (&e.type, &guid_hfs)) { type = MBR_PARTITION_TYPE_HFS; } switch (type) { case MBR_PARTITION_TYPE_LINUX: case MBR_PARTITION_TYPE_RAID: case MBR_PARTITION_TYPE_LVM: if (!seen_linux) { seen_linux++; bootable++; } } mbr_entry_from_gpt_entry (&m->entry[mbr_entry++], &h.header, &e, bootable, type); if (mbr_entry == 4) break; } for (; mbr_entry < 4; ++mbr_entry) { memset (&m->entry[mbr_entry], 0, sizeof (MBR_entry)); } disk_write (d, mbuf, 0, 1); }