// Matrix Construct // // Copyright (C) Matrix Construct Developers, Authors & Contributors // Copyright (C) 2016-2018 Jason Volk // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice is present in all copies. The // full license for this software is available in the LICENSE file. namespace ircd::mods { struct mod; struct log::log extern log; extern const filesystem::path suffix; filesystem::path prefix_if_relative(const filesystem::path &path); filesystem::path postfixed(const filesystem::path &path); filesystem::path unpostfixed(const filesystem::path &path); template R info(const filesystem::path &, F&& closure); std::vector sections(const filesystem::path &path); std::vector symbols(const filesystem::path &path); std::vector symbols(const filesystem::path &path, const std::string §ion); std::unordered_map mangles(const std::vector &); std::unordered_map mangles(const filesystem::path &path); std::unordered_map mangles(const filesystem::path &path, const std::string §ion); // Get the full path of a [valid] available module by name filesystem::path fullpath(const std::string &name); // Checks if loadable module containing a mapi header (does not verify the magic) bool is_module(const filesystem::path &); bool is_module(const filesystem::path &, std::string &why); bool is_module(const filesystem::path &, std::nothrow_t); } /// Internal module representation struct ircd::mods::mod :std::enable_shared_from_this { static std::stack loading; // State of current dlopen() recursion. static std::map loaded; filesystem::path path; load_mode::type mode; std::deque children; std::unordered_map mangles; boost::dll::shared_library handle; const std::string _name; const std::string _location; mapi::header *header; // Metadata auto &operator[](const std::string &s) const { return header->meta.operator[](s); } auto &operator[](const std::string &s) { return header->meta.operator[](s); } auto &name() const { return _name; } auto &location() const { return _location; } auto &version() const { return header->version; } auto &description() const { return (*this)["description"]; } const std::string &mangle(const std::string &name) const; bool has(const std::string &name) const; template const T &get(const std::string &name) const; template T &get(const std::string &name); template const T *ptr(const std::string &name) const; template T *ptr(const std::string &name); bool unload(); mod(const filesystem::path &, const load_mode::type & = load_mode::rtld_local | load_mode::rtld_now); ~mod() noexcept; };