0
0
Fork 0
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:
Jason Volk 2019-06-02 15:12:32 -07:00
parent 0658f7c6be
commit db1b7cf5a3
3 changed files with 84 additions and 2 deletions

View file

@ -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();
}

View file

@ -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;
}

View file

@ -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;