#include "binfmt/BinaryFormat.h" #include "binfmt/ELF.h" #include "binfmt/Script.h" struct BinaryFormatDescriptor { binfmt_loader_creator_t creator; void* arg; }; Vector g_binary_formats; Result BinaryFormat::init() { TRY(register_binary_format(ELFLoader::create, nullptr)); TRY(register_binary_format(ScriptLoader::create, nullptr)); return {}; } Result BinaryFormat::register_binary_format(binfmt_loader_creator_t creator, void* arg) { return g_binary_formats.try_append({ creator, arg }); } Result> BinaryFormat::create_loader(SharedPtr inode) { for (const auto& format : g_binary_formats) { auto loader = TRY(format.creator(inode, format.arg)); if (TRY(loader->sniff())) return loader; } return err(ENOEXEC); } BinaryFormatLoader::BinaryFormatLoader(SharedPtr inode) : m_inode(inode) { }