use fmt; use mbr; use gpt; use sector; use os; use io; use fs; use strings; use errors; use rt; export fn convert(args: []str) void = { if (len(args) < 3) { fmt::fatalf("gptman.convert: needs disk"); }; let source = os::open(args[1], fs::flags::RDONLY)!; defer io::close(source)!; const source = mbr::from(source)!; let freeno: size = 0z; for (let i = 0z; i < 4; i += 1) { const entry = &source.bootsector.entries[i]; if (entry.lba_begin == 0 && entry.length == 0) continue; freeno += entry.length: size; }; let file = os::create(args[2], fs::mode::USER_RWX | fs::mode::GROUP_RX | fs::mode::OTHER_RX, fs::flags::RDWR)!; defer io::close(file)!; let vol = gpt::create(file, freeno); gpt::mkbackup(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, ... }; };