diff options
Diffstat (limited to 'cmd/util.ha')
| -rw-r--r-- | cmd/util.ha | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/cmd/util.ha b/cmd/util.ha index 832a96f..7bbeca8 100644 --- a/cmd/util.ha +++ b/cmd/util.ha @@ -5,33 +5,49 @@ use os; use gpt; -export fn mkvol(vol: str) io::file = { +export fn mkfile() io::file = { + const vol = os::args[1]; + return match (os::create(vol, fs::mode::USER_RWX | fs::mode::GROUP_RX | fs::mode::OTHER_RX, fs::flags::RDWR)) { case let v: io::file => yield v; case => - fmt::fatalf("{}: cannot open file {}", os::args[0], vol); + fmt::fatalf("gpt: cannot open file {}", vol); }; }; -export fn openvol(vol: str) io::file = { +export fn openfile() io::file = { + const vol = os::args[1]; + return match (os::open(vol, fs::flags::RDWR)) { case let v: io::file => yield v; case => - fmt::fatalf("{}: cannot open file {}", os::args[0], vol); + fmt::fatalf("gpt: cannot open file {}", vol); }; }; -export fn opengpt(vol: str) *gpt::gpt = { - const vol = openvol(vol); - - return match (gpt::from(vol)) { +export fn opengpt(fd: io::file) *gpt::gpt = { + return match (gpt::from(fd)) { case let g: *gpt::gpt => yield g; case io::error => - fmt::fatalf("{}: could not properly read disk {}", os::args[0], os::args[1]); + fmt::fatalf("gpt: could not properly read disk"); case => - fmt::fatalf("{}: no valid gpt in disk", os::args[0]); + fmt::fatalf("gpt: no valid gpt in disk"); }; }; + +export fn getgptentry(vol: *gpt::gpt, i: size) *gpt::entry = { + const header = vol.primary.header; + + if (i >= header.entries_len) + fmt::fatalf("gpt: invalid entry index"); + + const entry = &vol.primary.entries[i]; + + if (entry.lba_begin == 0 && entry.lba_end == 0) + fmt::fatalf("gpt: entry {} is not allocated", i); + + return entry; +}; |
