diff --git a/Source/Common/CMakeLists.txt b/Source/Common/CMakeLists.txt index f57c32b2f..7f5a1bcbb 100644 --- a/Source/Common/CMakeLists.txt +++ b/Source/Common/CMakeLists.txt @@ -1,8 +1,9 @@ set(NAME Common) set(SRCS ArgumentLoader.cpp - EnvironmentLoader.cpp Config.cpp + EnvironmentLoader.cpp + FileFormatCheck.cpp StringUtil.cpp) add_library(${NAME} STATIC ${SRCS}) diff --git a/Source/Common/FileFormatCheck.cpp b/Source/Common/FileFormatCheck.cpp new file mode 100644 index 000000000..e7e81ae44 --- /dev/null +++ b/Source/Common/FileFormatCheck.cpp @@ -0,0 +1,65 @@ +#include +#include + +namespace FEX::FormatCheck { + bool IsSquashFS(std::string const &Filename) { + // If it is a regular file then we need to check if it is a valid archive + struct SquashFSHeader { + uint32_t magic; + uint32_t inode_count; + uint32_t mtime; + uint32_t block_size; + uint32_t fragment_entry_count; + uint16_t compression_id; + uint16_t block_log; + uint16_t flags; + uint16_t id_count; + uint16_t version_major; + uint16_t version_minor; + uint64_t More[8]; // More things that don't matter to us + }; + + SquashFSHeader Header{}; + std::fstream File(Filename, std::ios::in); + + if (!File.is_open()) { + return false; + } + + if (!File.seekg(0, std::fstream::end)) { + return false; + } + + auto FileSize = File.tellg(); + if (File.fail()) { + return false; + } + + if (FileSize <= 0) { + return false; + } + + if (!File.seekg(0, std::fstream::beg)) { + return false; + } + + if (FileSize < sizeof(SquashFSHeader)) { + return false; + } + + if (!File.read(reinterpret_cast(&Header), sizeof(SquashFSHeader))) { + return false; + } + + // Make sure the cookie matches + if (Header.magic == 0x73717368) { + // Sanity check the version + uint32_t version = (uint32_t)Header.version_major << 16 | Header.version_minor; + if (version >= 0x00040000) { + // Everything is sane, we can add it + return true; + } + } + return false; + } +} diff --git a/Source/Common/FileFormatCheck.h b/Source/Common/FileFormatCheck.h new file mode 100644 index 000000000..25de61315 --- /dev/null +++ b/Source/Common/FileFormatCheck.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +namespace FEX::FormatCheck { + bool IsSquashFS(std::string const &Filename); +}