diff --git a/run/xml_term_edit.run b/run/xml_term_edit.run
index 3c56c42..831e99a 100644
--- a/run/xml_term_edit.run
+++ b/run/xml_term_edit.run
@@ -105,7 +105,7 @@ append config {
-
+
diff --git a/src/app/xml_term_edit/component.cc b/src/app/xml_term_edit/component.cc
index 4c7c23d..cb1d45d 100644
--- a/src/app/xml_term_edit/component.cc
+++ b/src/app/xml_term_edit/component.cc
@@ -13,17 +13,22 @@
/* Genode includes */
#include
-#include
-#include
#include
#include
#include
-#include
+#include
/* Cli_monitor includes */
#include
#include
+/* Libc includes */
+#include
+#include
+#include
+#include
+#include
+#include
namespace Xml_term_edit {
using namespace Genode;
@@ -36,94 +41,46 @@ namespace Xml_term_edit {
struct Main;
}
-Genode::Env *_env;
-
struct Xml_term_edit::Command : Cli_monitor::Command
{
- Vfs::Dir_file_system &vfs;
Genode::Allocator &alloc;
Reporter &report;
- Vfs::Vfs_handle *root_handle = nullptr;
Command(char const *name,
char const *desc,
Command_registry &cmds,
- Vfs::Dir_file_system &vfs,
Genode::Allocator &alloc,
Reporter &report)
:
Cli_monitor::Command(name, desc),
- vfs(vfs), alloc(alloc), report(report)
+ alloc(alloc), report(report)
{
- auto r = vfs.open(
- "/", Vfs::Directory_service::OPEN_MODE_RDONLY, &root_handle, alloc);
- if (r != Vfs::Directory_service::Open_result::OPEN_OK) {
- Genode::error("failed to open VFS root directory");
- throw r;
- }
-
cmds.insert(this);
}
+ /**
+ * TODO: this is too slow, cache it
+ */
void _for_each_argument(Argument_fn const &fn) const override
{
- typedef Vfs::File_io_service::Read_result Result;
+ DIR *dirp = opendir("/");
+ if (dirp == NULL) {
+ Genode::error("failed to read root directory");
+ return;
+ }
- enum { DIRENT_COUNT = 4096 / sizeof(Vfs::Directory_service::Dirent) };
- Vfs::Directory_service::Dirent dirents[DIRENT_COUNT];
- memset(dirents, 0x00, sizeof(dirents));
-
- root_handle->seek(0);
-
- for (;;) {
- while (!vfs.queue_read(root_handle, sizeof(dirents))) {
- _env->ep().wait_and_dispatch_one_io_signal();
- }
- Vfs::file_size read_count = 0;
- Result r;
- for (;;) {
- r = vfs.complete_read(
- root_handle, (char*)&dirents, sizeof(dirents), read_count);
- if (r == Result::READ_QUEUED) {
- _env->ep().wait_and_dispatch_one_io_signal();
- }
- else
- break;
- }
-
- if (r != Result::READ_OK) {
- Genode::error("failed to read subsystems");
- return;
- }
-
- if (read_count == 0) return;
- root_handle->advance_seek(read_count);
- read_count = read_count / sizeof(Vfs::Directory_service::Dirent);
-
- for (unsigned i = 0; i < read_count; i++) {
- Vfs::Directory_service::Dirent const &e = dirents[i];
-
- switch (e.type) {
- case Vfs::Directory_service::DIRENT_TYPE_FILE:
- /* check if the VFS returned junk */
- if (e.name[0] != '\0')
- fn(Argument(e.name, ""));
- break;
- case Vfs::Directory_service::DIRENT_TYPE_END:
- return;
- default:
- break;
- }
+ dirent *dp;
+ while ((dp = readdir(dirp)) != NULL) {
+ if (dp->d_type == DT_REG) {
+ fn(Argument(dp->d_name, ""));
}
}
+ closedir(dirp);
}
void insert_file_content(Command_line &cmd, Xml_generator gen)
{
- using namespace Vfs;
-
Path<128> path;
- Vfs_handle *handle;
{
char name[128] = { '\0' };
if (cmd.argument(0, name, sizeof(name)) == false) {
@@ -133,41 +90,24 @@ struct Xml_term_edit::Command : Cli_monitor::Command
path.import(name);
}
- Directory_service::Stat sb;
- vfs.stat(path.base(), sb);
-
- /* XXX: error handling */
- if (!sb.size)
- return;
-
- typedef Directory_service::Open_result Open_result;
- Open_result res = vfs.open(
- path.base(),
- Directory_service::OPEN_MODE_RDONLY,
- &handle,
- alloc);
- switch (res) {
- case Open_result::OPEN_OK:
- break;
- default:
- error("failed to open '", path, "'");
- /* XXX: log and write error info to the terminal */
+ int fd = open(path.base(), O_RDONLY);
+ if (fd == -1) {
+ Genode::error("failed to open '", path, "'");
return;
}
- Vfs_handle::Guard guard(handle);
char buf[1024];
- file_size offset = 0;
- while (offset < sb.size) {
- file_size n = 0;
- file_size count = min(sizeof(buf), sb.size-offset);
- handle->fs().complete_read(handle, buf, count, n);
- if (!n)
- return;
- gen.append(buf, n);
- offset += n;
- handle->advance_seek(n);
+ for (;;) {
+ auto n = read(fd, buf, sizeof(buf));
+ if (n > 0) {
+ gen.append(buf, n);
+ } else {
+ if (n < 0)
+ Genode::error("failed to read '", path, "'");
+ break;
+ }
}
+ close(fd);
}
};
@@ -175,10 +115,9 @@ struct Xml_term_edit::Command : Cli_monitor::Command
struct Xml_term_edit::Add_command : Xml_term_edit::Command
{
Add_command(Command_registry &cmds,
- Vfs::Dir_file_system &vfs,
Genode::Allocator &alloc,
Reporter &report)
- : Command("add", "add a new subsystem to init", cmds, vfs, alloc, report)
+ : Command("add", "add a new subsystem to init", cmds, alloc, report)
{ }
void execute(Command_line &cmd, Terminal::Session &terminal) override
@@ -193,10 +132,9 @@ struct Xml_term_edit::Add_command : Xml_term_edit::Command
struct Xml_term_edit::Del_command : Xml_term_edit::Command
{
Del_command(Command_registry &cmds,
- Vfs::Dir_file_system &vfs,
Genode::Allocator &alloc,
Reporter &report)
- : Command("del", "delete a subsystem from init", cmds, vfs, alloc, report)
+ : Command("del", "delete a subsystem from init", cmds, alloc, report)
{ }
void execute(Command_line &cmd, Terminal::Session &terminal) override
@@ -237,18 +175,8 @@ struct Xml_term_edit::Main
}
}
- struct Io_response_handler : Vfs::Io_response_handler
- {
- void handle_io_response(Vfs::Vfs_handle::Context *) override { }
- } io_response_handler;
-
Heap heap { env.ram(), env.rm() };
- Vfs::Global_file_system_factory vfs_factory { heap };
-
- Vfs::Dir_file_system vfs_root {
- env, heap, vfs_config(), io_response_handler, vfs_factory };
-
Terminal::Connection term { env, "edit" };
Reporter reporter { env, "xml_editor", "edit", env.ram().avail_ram().value / 2 };
@@ -265,8 +193,8 @@ struct Xml_term_edit::Main
return nullptr;
}
- Add_command add_command { cmds, vfs_root, heap, reporter };
- Del_command del_command { cmds, vfs_root, heap, reporter };
+ Add_command add_command { cmds, heap, reporter };
+ Del_command del_command { cmds, heap, reporter };
Exit_command exit_command { cmds, env.parent() };
enum { COMMAND_MAX_LEN = 1024 };
@@ -290,24 +218,29 @@ struct Xml_term_edit::Main
void Xml_term_edit::Main::handle_term()
{
- while (term.avail() && !editor.completed()) {
- char c = 0;
- term.read(&c, 1);
- editor.submit_input(c);
- }
+ Libc::with_libc([&] () {
- if (editor.completed()) {
- auto *cmd = lookup_command(cmd_buf);
- if (cmd) {
- Cli_monitor::Command_line cmd_line(cmd_buf, *cmd);
- cmd->execute(cmd_line, term);
+ while (term.avail() && !editor.completed()) {
+ char c = 0;
+ term.read(&c, 1);
+ editor.submit_input(c);
}
- editor.reset();
- }
+
+ if (editor.completed()) {
+
+ auto *cmd = lookup_command(cmd_buf);
+ if (cmd) {
+ Cli_monitor::Command_line cmd_line(cmd_buf, *cmd);
+ cmd->execute(cmd_line, term);
+ }
+ editor.reset();
+ }
+ });
}
-void Component::construct(Genode::Env &env)
+void Libc::Component::construct(Libc::Env &env)
{
- _env = &env;
- static Xml_term_edit::Main inst(env);
+ Libc::with_libc([&] () {
+ static Xml_term_edit::Main inst(env);
+ });
}
diff --git a/src/app/xml_term_edit/target.mk b/src/app/xml_term_edit/target.mk
index 1f6f2e1..68e3693 100644
--- a/src/app/xml_term_edit/target.mk
+++ b/src/app/xml_term_edit/target.mk
@@ -1,5 +1,5 @@
TARGET = xml_term_edit
SRC_CC = component.cc
-LIBS = base vfs
+LIBS = base libc
INC_DIR += $(PRG_DIR) $(call select_from_repositories,src/app/cli_monitor)