#include "binfmt/BinaryFormat.h" #include "binfmt/ELF.h" struct BinaryFormatDescriptor { binfmt_loader_creator_t creator; void* arg; }; Vector<BinaryFormatDescriptor> g_binary_formats; Result<void> BinaryFormat::init() { TRY(register_binary_format(ELFLoader::create, nullptr)); return {}; } Result<void> BinaryFormat::register_binary_format(binfmt_loader_creator_t creator, void* arg) { return g_binary_formats.try_append({ creator, arg }); } Result<SharedPtr<BinaryFormatLoader>> BinaryFormat::create_loader(SharedPtr<VFS::Inode> 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<VFS::Inode> inode) : m_inode(inode) { }