mirror of
https://github.com/matrix-construct/construct
synced 2024-09-27 11:18:51 +02:00
ircd::mods::ldso: Add more primary interface tools; add semantic version parse.
This commit is contained in:
parent
0658f7c6be
commit
db1b7cf5a3
3 changed files with 84 additions and 2 deletions
|
@ -25,10 +25,19 @@ extern "C"
|
|||
namespace ircd::mods::ldso
|
||||
{
|
||||
using link_closure = std::function<bool (struct link_map &)>;
|
||||
using semantic_version = std::array<long, 3>;
|
||||
|
||||
string_view name(const struct link_map &);
|
||||
string_view fullname(const struct link_map &); // /lib/x86_64-linux-gnu/libz.so.1
|
||||
string_view soname(const string_view &fullname); // libz.so.1
|
||||
string_view soname(const struct link_map &); // libz.so.1
|
||||
string_view name(const string_view &soname); // z
|
||||
string_view name(const struct link_map &); // z
|
||||
semantic_version version(const string_view &soname); // 1.0.0
|
||||
semantic_version version(const struct link_map &map); // 1.0.0
|
||||
|
||||
bool for_each(const link_closure &);
|
||||
bool has_fullname(const string_view &path);
|
||||
bool has_soname(const string_view &name);
|
||||
bool has(const string_view &name);
|
||||
size_t count();
|
||||
}
|
||||
|
|
|
@ -44,6 +44,28 @@ ircd::mods::ldso::has(const string_view &name)
|
|||
});
|
||||
}
|
||||
|
||||
bool
|
||||
ircd::mods::ldso::has_soname(const string_view &name)
|
||||
{
|
||||
return !for_each([&name]
|
||||
(const auto &link)
|
||||
{
|
||||
// false to break
|
||||
return name == soname(link)? false : true;
|
||||
});
|
||||
}
|
||||
|
||||
bool
|
||||
ircd::mods::ldso::has_fullname(const string_view &name)
|
||||
{
|
||||
return !for_each([&name]
|
||||
(const auto &link)
|
||||
{
|
||||
// false to break
|
||||
return name == fullname(link)? false : true;
|
||||
});
|
||||
}
|
||||
|
||||
bool
|
||||
ircd::mods::ldso::for_each(const link_closure &closure)
|
||||
{
|
||||
|
@ -65,8 +87,59 @@ ircd::mods::ldso::for_each(const link_closure &closure)
|
|||
return true;
|
||||
}
|
||||
|
||||
ircd::mods::ldso::semantic_version
|
||||
ircd::mods::ldso::version(const struct link_map &map)
|
||||
{
|
||||
return version(soname(map));
|
||||
}
|
||||
|
||||
ircd::mods::ldso::semantic_version
|
||||
ircd::mods::ldso::version(const string_view &soname)
|
||||
{
|
||||
const auto str
|
||||
{
|
||||
split(soname, ".so.").second
|
||||
};
|
||||
|
||||
string_view val[3];
|
||||
const size_t num
|
||||
{
|
||||
tokens(str, '.', val)
|
||||
};
|
||||
|
||||
semantic_version ret {0};
|
||||
for(size_t i(0); i < num && i < 3; ++i)
|
||||
ret[i] = lex_cast<long>(val[i]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::mods::ldso::name(const struct link_map &map)
|
||||
{
|
||||
return name(soname(map));
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::mods::ldso::name(const string_view &soname)
|
||||
{
|
||||
return lstrip(split(soname, '.').first, "lib");
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::mods::ldso::soname(const struct link_map &map)
|
||||
{
|
||||
return soname(fullname(map));
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::mods::ldso::soname(const string_view &fullname)
|
||||
{
|
||||
return token_last(fullname, '/');
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::mods::ldso::fullname(const struct link_map &map)
|
||||
{
|
||||
return map.l_name;
|
||||
}
|
||||
|
|
|
@ -1651,7 +1651,7 @@ console_cmd__mod__links(opt &out, const string_view &line)
|
|||
(const auto &link)
|
||||
{
|
||||
out << std::setw(2) << (i++)
|
||||
<< " " << mods::ldso::name(link)
|
||||
<< " " << mods::ldso::fullname(link)
|
||||
<< std::endl;
|
||||
|
||||
return true;
|
||||
|
|
Loading…
Reference in a new issue