use fmt; use cmd; use mbr; use gpt; use sector; use os; use io; use fs; use strings; use errors; use rt; export fn convert(vol: str, args: []str) void = { if (len(args) < 2) { fmt::fatalf("convert: needs disk"); }; let source = os::open(args[1], fs::flags::RDONLY)!; defer io::close(source)!; const source = mbr::from(source)!; const vol = cmd::openvol(vol); let vol = gpt::from(vol)!; defer { gpt::chksums(vol); gpt::commit(vol)!; gpt::finish(vol); }; rt::memcpy(vol.mbr, source.bootsector, size(mbr::bootsector)); for (let i = 0z; i < 4; i += 1) { const entry = &source.bootsector.entries[i]; if (entry.lba_begin == 0 && entry.length == 0) continue; const reader = mbr::partstream_reader(source, entry)!; const partlength = entry.length; const part = gpt::allocate(vol, partlength) as *gpt::entry; const writer = gpt::partstream_writer(vol, part)!; io::copy(&writer, &reader)!; vol.mbr.entries[i].lba_begin = part.lba_begin: u32; vol.mbr.entries[i].length = (part.lba_end - part.lba_begin + 1): u32; }; vol.mbr.entries[3] = mbr::entry { part_type = 0xEE, lba_begin = 0, length = -1: u32, ... }; };