summaryrefslogtreecommitdiff
path: root/header/header.ha
diff options
context:
space:
mode:
authorAlejandro Sior <aho@sior.be>2022-06-18 13:54:25 +0200
committerAlejandro Sior <aho@sior.be>2022-06-18 13:54:25 +0200
commit6117a803ad717fd50003c0bd8fbe393db2dcac6b (patch)
treea01ba73f37570b96bebef8c193abaf686ef9f696 /header/header.ha
parentd6181b5e4f6f2dc72907e9f2e73db9ce0075cddd (diff)
add header command
Diffstat (limited to 'header/header.ha')
-rw-r--r--header/header.ha37
1 files changed, 37 insertions, 0 deletions
diff --git a/header/header.ha b/header/header.ha
new file mode 100644
index 0000000..9602071
--- /dev/null
+++ b/header/header.ha
@@ -0,0 +1,37 @@
+use fmt;
+use io;
+
+use gpt;
+
+export fn header(vol: io::file, args: []str) void = {
+ const vol = match (gpt::from(vol)) {
+ case let g: *gpt::gpt =>
+ yield g;
+ case gpt::nogpt =>
+ fmt::fatalf("gpt.header: disk {} does not have valid gpt", args[0]);
+ case =>
+ fmt::fatalf("gpt.header: could not access disk {}", args[0]);
+ };
+ defer gpt::finish(vol);
+
+ const header = vol.primary.header;
+
+ fmt::printfln("revision: \t\t{}", header.revision)!;
+ fmt::printfln("header_size: \t\t{}", header.header_size)!;
+ fmt::printfln("header_crc32: \t\t{}", header.header_crc32)!;
+ fmt::printfln("header_lba: \t\t{}", header.header_lba)!;
+ fmt::printfln("backup_header_lba: \t{}", header.backup_header_lba)!;
+ fmt::printfln("first_lba: \t\t{}", header.first_lba)!;
+ fmt::printfln("last_lba: \t\t{}", header.last_lba)!;
+ fmt::printfln("disk_guid: \t\t[{},{}]", header.disk_guid[0], header.disk_guid[1])!;
+ fmt::printfln("entries_lba: \t\t{}", header.entries_lba)!;
+ fmt::printfln("entries_len: \t\t{}", header.entries_len)!;
+ fmt::printfln("entry_size: \t\t{}", header.entry_size)!;
+ fmt::printfln("entries_crc32: \t\t{}", header.entries_crc32)!;
+
+ const primary_valid = gpt::header_crc32(header) == header.header_crc32 && gpt::entries_crc32(vol.primary.entries) == header.entries_crc32;
+ const backup_valid = gpt::header_crc32(vol.backup.header) == vol.backup.header.header_crc32 && gpt::entries_crc32(vol.backup.entries) == vol.backup.header.entries_crc32;
+
+ fmt::printfln("primary_sane: \t\t{}", primary_valid)!;
+ fmt::printfln("backup_sane: \t\t{}", backup_valid)!;
+};