aboutsummaryrefslogtreecommitdiffstats
path: root/src/sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sync.c')
-rw-r--r--src/sync.c68
1 files changed, 45 insertions, 23 deletions
diff --git a/src/sync.c b/src/sync.c
index 1b0638b..38bb84f 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -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);