From 192792e30a2d7d632422a5bd540d9320d6fc31f2 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Thu, 6 Feb 2025 08:25:30 -0600 Subject: [PATCH] iso9660/test: add rock ridge parsing --- iso9660/test.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/iso9660/test.cpp b/iso9660/test.cpp index bdbdd99..a537681 100644 --- a/iso9660/test.cpp +++ b/iso9660/test.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "primary_volume_descriptor.hpp" #include "directory_record.hpp" @@ -49,10 +50,41 @@ int main() write_field(dr->file_identifier, dr->length_of_file_identifier); std::cout << std::hex << "file_flags: " << (int)dr->file_flags << '\n'; + uint32_t system_use_offset = 33 + dr->length_of_file_identifier + ((dr->length_of_file_identifier & 1) == 0); + const char * system_use = &str[offset + system_use_offset]; + std::cout << "system use:\n"; + + for (int i = 0; i < dr->length_of_directory_record - system_use_offset;) { + std::cout << " entry: "; + std::cout << system_use[i + 0] << system_use[i + 1] << '\n'; + + int length = (uint8_t)system_use[i + 2]; + std::cout << " length: "; + std::cout << length << '\n'; + + if (system_use[i + 0] == 'N' && system_use[i + 1] == 'M') { + int version = (uint8_t)system_use[i + 3]; + assert(version == 1); + int flags = (uint8_t)system_use[i + 4]; + if (flags == 0) { + std::cout << "name: "; + for (int j = 5; j < length; j++) { + std::cout << system_use[i + j]; + } + std::cout << '\n'; + } + } + + if (length == 0) length = 1; + i += length; + } + std::cout << '\n'; + if (dr->file_flags == 0) { std::cout << "location_of_extent: " << dr->location_of_extent.get() << '\n'; std::cout << "data_length: " << std::dec << dr->data_length.get() << '\n'; + /* if (dr->file_identifier[0] != '1') { const uint32_t extent = dr->location_of_extent.get() * 2048; auto file = reinterpret_cast(&str[extent]); @@ -60,6 +92,7 @@ int main() write_field(file, dr->data_length.get()); std::cout << "---end file content---\n"; } + */ } offset += dr->length_of_directory_record;