#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; 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 (!guid_cmp (&e.type, &guid_efi)) { type = MBR_PARTITION_TYPE_EFI; } 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; } if ((type == MBR_PARTITION_TYPE_LINUX) && (!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); }