diff options
Diffstat (limited to 'src/sync.c')
-rw-r--r-- | src/sync.c | 68 |
1 files changed, 45 insertions, 23 deletions
@@ -8,37 +8,59 @@ sync_tables (DISK * d) uint8_t mbuf[512]; GPT_headers h; int i; - GUID guid_ext3=GUID_TYPE_LINUX_EXT3; - GUID guid_swap=GUID_TYPE_LINUX_SWAP; - int me=0; + 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); - - mbr_set_entry0_from_gpt_header(&m->entry[me++],&h.header); + h = headers_get (d); for (i = 0; i < h.header.n_partition_entries; ++i) { - GPT_entry e = entry_read (d, &h.header, i); - if (!guid_cmp(&e.type,&guid_swap)) { - mbr_entry_from_gpt_entry (&m->entry[me++],&e,(me==1),MBR_PARTITION_TYPE_LINUX); - } else if (!guid_cmp(&e.type,&guid_ext3)) { - mbr_entry_from_gpt_entry (&m->entry[me++],&e,(me==1),MBR_PARTITION_TYPE_SWAP); - - - } - if (me==4) break; - } - - for (i=0;i<me;++i ) { - if ((m->entry[i].system==MBR_PARTITION_TYPE_SWAP) || (i==(me-1))) { - mbr_wedge_entry(&m->entry[i]); - break; - } - } + 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); |