server/report_rom: partial ROM label matching

Fixes #1801
This commit is contained in:
Emery Hemingway 2015-11-30 15:00:10 +01:00 committed by Christian Helmuth
parent 23ff3b1877
commit 6e9fa10e65
3 changed files with 25 additions and 40 deletions

View File

@ -28,10 +28,8 @@ install_config {
<resource name="RAM" quantum="2M"/>
<provides> <service name="ROM"/> <service name="Report"/> </provides>
<config>
<rom>
<policy label="test-report_rom -> brightness"
report="test-report_rom -> brightness"/>
</rom>
<policy label_prefix="test-report_rom ->" label_suffix="brightness"
report="test-report_rom -> brightness"/>
</config>
</start>
<start name="test-report_rom">

View File

@ -25,7 +25,6 @@
namespace Server {
using Genode::env;
using Genode::Xml_node;
struct Main;
}
@ -37,26 +36,9 @@ struct Server::Main
Genode::Sliced_heap sliced_heap = { env()->ram_session(),
env()->rm_session() };
Xml_node _rom_config_node() const
{
try {
return Genode::config()->xml_node().sub_node("rom"); }
catch (Xml_node::Nonexistent_sub_node) {
PWRN("missing <rom> configuration");
return Xml_node("<rom>");
}
}
Rom::Registry rom_registry = { sliced_heap };
Rom::Registry rom_registry = { sliced_heap, _rom_config_node() };
bool _verbose_config()
{
char const *attr = "verbose";
return Genode::config()->xml_node().has_attribute(attr)
&& Genode::config()->xml_node().attribute(attr).has_value("yes");
}
bool verbose = _verbose_config();
bool verbose = Genode::config()->xml_node().attribute_value("verbose", false);
Report::Root report_root = { ep, sliced_heap, rom_registry, verbose };
Rom ::Root rom_root = { ep, sliced_heap, rom_registry };

View File

@ -16,6 +16,7 @@
/* Genode includes */
#include <report_rom/rom_registry.h>
#include <os/session_policy.h>
namespace Rom { struct Registry; }
@ -26,8 +27,6 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
Genode::Allocator &_md_alloc;
Xml_node _config;
Module_list _modules;
struct Read_write_policy : Module::Read_policy, Module::Write_policy
@ -115,20 +114,26 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
*/
Module::Name _report_name(Module::Name const &rom_label) const
{
using namespace Genode;
String<Rom::Module::Name::capacity()> report;
try {
for (Xml_node node = _config.sub_node("policy");
true; node = node.next("policy")) {
Session_policy policy(rom_label);
policy.attribute("report").value(&report);
return Rom::Module::Name(report.string());
} catch (Session_policy::No_policy_defined) {
/* FIXME backwards compatibility, remove at next release */
try {
Xml_node rom_node = config()->xml_node().sub_node("rom");
PWRN("parsing legacy <rom> policies");
if (!node.has_attribute("label")
|| !node.has_attribute("report")
|| !node.attribute("label").has_value(rom_label.string()))
continue;
char report[Rom::Module::Name::capacity()];
node.attribute("report").value(report, sizeof(report));
return Rom::Module::Name(report);
}
} catch (Xml_node::Nonexistent_sub_node) { }
Session_policy policy(rom_label, rom_node);
policy.attribute("report").value(&report);
return Rom::Module::Name(report.string());
} catch (Xml_node::Nonexistent_sub_node) { /* no <rom> node */ }
catch (Session_policy::No_policy_defined) { }
}
PWRN("no valid policy for label \"%s\"", rom_label.string());
throw Root::Invalid_args();
@ -136,9 +141,9 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
public:
Registry(Genode::Allocator &md_alloc, Xml_node config)
Registry(Genode::Allocator &md_alloc)
:
_md_alloc(md_alloc), _config(config)
_md_alloc(md_alloc)
{ }
Module &lookup(Writer &writer, Module::Name const &name) override