diff --git a/repos/os/src/server/lx_fs/directory.h b/repos/os/src/server/lx_fs/directory.h index c58248e3a0..02213891ba 100644 --- a/repos/os/src/server/lx_fs/directory.h +++ b/repos/os/src/server/lx_fs/directory.h @@ -24,6 +24,7 @@ #include #include +#include namespace Lx_fs { @@ -113,6 +114,14 @@ class Lx_fs::Directory : public Node closedir(_fd); } + void rename(Directory &dir_to, char const *name_from, char const *name_to) + { + int ret = renameat(dirfd(_fd), name_from, + dirfd(dir_to._fd), name_to); + if (ret != 0) + throw Unavailable(); + } + /* FIXME returned file node must be locked */ File * file(char const *name, Mode mode, bool create) override { diff --git a/repos/os/src/server/lx_fs/main.cc b/repos/os/src/server/lx_fs/main.cc index 1b15d9a2de..7d7577669a 100644 --- a/repos/os/src/server/lx_fs/main.cc +++ b/repos/os/src/server/lx_fs/main.cc @@ -351,9 +351,32 @@ class Lx_fs::Session_component : public Session_rpc_object } } - void move(Dir_handle, Name const &, Dir_handle, Name const &) override + void move(Dir_handle dir_from, Name const & name_from, + Dir_handle dir_to, Name const & name_to) override { - Genode::error(__func__, " not implemented"); + typedef File_system::Open_node Dir_node; + + Directory *to = 0; + + auto to_fn = [&] (Dir_node &dir_node) { + to = &dir_node.node(); + }; + + try { + _open_node_registry.apply(dir_to, to_fn); + } catch (Id_space::Unknown_id const &) { + throw Invalid_handle(); + } + + auto move_fn = [&] (Dir_node &dir_node) { + dir_node.node().rename(*to, name_from.string(), name_to.string()); + }; + + try { + _open_node_registry.apply(dir_from, move_fn); + } catch (Id_space::Unknown_id const &) { + throw Invalid_handle(); + } } };