mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-22 18:22:41 +00:00
parent
7ada79b5ca
commit
2986d46fd3
@ -21,10 +21,22 @@
|
|||||||
|
|
||||||
namespace Fs_tool {
|
namespace Fs_tool {
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
struct Byte_buffer;
|
||||||
struct Main;
|
struct Main;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct Fs_tool::Byte_buffer : Byte_range_ptr
|
||||||
|
{
|
||||||
|
Allocator &_alloc;
|
||||||
|
|
||||||
|
Byte_buffer(Allocator &alloc, size_t size)
|
||||||
|
: Byte_range_ptr((char *)alloc.alloc(size), size), _alloc(alloc) { }
|
||||||
|
|
||||||
|
~Byte_buffer() { _alloc.free(start, num_bytes); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Fs_tool::Main
|
struct Fs_tool::Main
|
||||||
{
|
{
|
||||||
Env &_env;
|
Env &_env;
|
||||||
@ -46,9 +58,11 @@ struct Fs_tool::Main
|
|||||||
|
|
||||||
typedef Directory::Path Path;
|
typedef Directory::Path Path;
|
||||||
|
|
||||||
void _remove_file(Xml_node);
|
void _copy_file(Path const &from, Path const &to, Byte_range_ptr const &);
|
||||||
|
|
||||||
void _new_file(Xml_node);
|
void _remove_file (Xml_node const &);
|
||||||
|
void _new_file (Xml_node const &);
|
||||||
|
void _copy_all_files (Xml_node const &);
|
||||||
|
|
||||||
void _handle_config()
|
void _handle_config()
|
||||||
{
|
{
|
||||||
@ -67,6 +81,9 @@ struct Fs_tool::Main
|
|||||||
|
|
||||||
if (operation.has_type("new-file"))
|
if (operation.has_type("new-file"))
|
||||||
_new_file(operation);
|
_new_file(operation);
|
||||||
|
|
||||||
|
if (operation.has_type("copy-all-files"))
|
||||||
|
_copy_all_files(operation);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (config.attribute_value("exit", false)) {
|
if (config.attribute_value("exit", false)) {
|
||||||
@ -83,7 +100,7 @@ struct Fs_tool::Main
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void Fs_tool::Main::_remove_file(Xml_node operation)
|
void Fs_tool::Main::_remove_file(Xml_node const &operation)
|
||||||
{
|
{
|
||||||
Path const path = operation.attribute_value("path", Path());
|
Path const path = operation.attribute_value("path", Path());
|
||||||
|
|
||||||
@ -108,7 +125,7 @@ void Fs_tool::Main::_remove_file(Xml_node operation)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Fs_tool::Main::_new_file(Xml_node operation)
|
void Fs_tool::Main::_new_file(Xml_node const &operation)
|
||||||
{
|
{
|
||||||
Path const path { operation.attribute_value("path", Path()) };
|
Path const path { operation.attribute_value("path", Path()) };
|
||||||
|
|
||||||
@ -140,5 +157,55 @@ void Fs_tool::Main::_new_file(Xml_node operation)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Fs_tool::Main::_copy_file(Path const &from, Path const &to,
|
||||||
|
Byte_range_ptr const &buffer)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Readonly_file const src { _root_dir, from };
|
||||||
|
New_file dst { _root_dir, to };
|
||||||
|
|
||||||
|
Readonly_file::At at { 0 };
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
|
||||||
|
size_t const read_bytes = src.read(at, buffer);
|
||||||
|
|
||||||
|
dst.append(buffer.start, read_bytes);
|
||||||
|
|
||||||
|
at.value += read_bytes;
|
||||||
|
|
||||||
|
if (read_bytes < buffer.num_bytes)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
|
error("failed to copy ", from, " to ", to); }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Fs_tool::Main::_copy_all_files(Xml_node const &operation)
|
||||||
|
{
|
||||||
|
Number_of_bytes const default_buffer { 1024*1024 };
|
||||||
|
Byte_buffer buffer(_heap, operation.attribute_value("buffer", default_buffer));
|
||||||
|
|
||||||
|
Path const from = operation.attribute_value("from", Path());
|
||||||
|
Path const to = operation.attribute_value("to", Path());
|
||||||
|
|
||||||
|
if (!_root_dir.directory_exists(from))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Directory(_root_dir, from).for_each_entry([&] (Directory::Entry const &entry) {
|
||||||
|
|
||||||
|
bool const continous_file =
|
||||||
|
(entry.type() == Vfs::Directory_service::Dirent_type::CONTINUOUS_FILE);
|
||||||
|
|
||||||
|
if (continous_file)
|
||||||
|
_copy_file(Path(from, "/", entry.name()),
|
||||||
|
Path(to, "/", entry.name()),
|
||||||
|
buffer);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Component::construct(Genode::Env &env) { static Fs_tool::Main main(env); }
|
void Component::construct(Genode::Env &env) { static Fs_tool::Main main(env); }
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user