genode/repos/os/src/server/part_blk/main.cc
Norman Feske cd3a5852d6 Warn about the use of deprecated headers
This commit enables compile-time warnings displayed whenever a deprecated
API header is included, and adjusts the existing #include directives
accordingly.

Issue #1987
2017-01-31 12:01:18 +01:00

94 lines
2.1 KiB
C++

/*
* \brief Front end of the partition server
* \author Sebastian Sumpf
* \author Stefan Kalkowski
* \author Josef Soentgen
* \date 2011-05-30
*/
/*
* Copyright (C) 2011-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#include <base/attached_rom_dataspace.h>
#include <block_session/rpc_object.h>
#include "component.h"
#include "driver.h"
#include "gpt.h"
#include "mbr.h"
void Block::Driver::_ready_to_submit() {
Block::Session_component::wake_up(); }
class Main
{
private:
Block::Partition_table & _table();
Genode::Env & _env;
Genode::Heap _heap { _env.ram(), _env.rm() };
Block::Driver _driver { _env, _heap };
Mbr_partition_table _mbr { _heap, _driver };
Gpt _gpt { _heap, _driver };
Block::Root _root { _env, _heap, _driver, _table() };
public:
class No_partion_table : Genode::Exception {};
Main(Genode::Env &env) : _env(env)
{
/*
* we read all partition information,
* now it's safe to turn in asynchronous mode
*/
_driver.work_asynchronously();
/* announce at parent */
env.parent().announce(env.ep().manage(_root));
}
};
Block::Partition_table & Main::_table()
{
bool valid_mbr = false;
bool valid_gpt = false;
bool use_gpt = false;
try {
Genode::Attached_rom_dataspace config(_env, "config");
use_gpt = config.xml().attribute_value("use_gpt", false);
} catch(...) {}
if (use_gpt)
try { valid_gpt = _gpt.parse(); } catch (...) { }
/* fall back to MBR */
if (!valid_gpt) {
try { valid_mbr = _mbr.parse(); }
catch (Mbr_partition_table::Protective_mbr_found) {
if (!use_gpt)
Genode::error("Aborting: found protective MBR but ",
"GPT usage was not requested.");
throw;
}
}
if (valid_gpt) return _gpt;
if (valid_mbr) return _mbr;
Genode::error("Aborting: no partition table found.");
throw No_partion_table();
}
void Component::construct(Genode::Env &env) { static Main main(env); }