diff --git a/repos/libports/include/ffat/block.h b/repos/libports/include/ffat/block.h
new file mode 100644
index 0000000000..6d6a2e82aa
--- /dev/null
+++ b/repos/libports/include/ffat/block.h
@@ -0,0 +1,26 @@
+/*
+ * \brief Block session initialize function
+ * \author Josef Soentgen
+ * \date 2017-03-07
+ */
+
+/*
+ * Copyright (C) 2017 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU Affero General Public License version 3.
+ */
+
+#ifndef _INCLUDE__FFAT__BLOCK_H_
+#define _INCLUDE__FFAT__BLOCK_H_
+
+namespace Genode {
+ struct Env;
+ struct Allocator;
+}
+
+namespace Ffat {
+ void block_init(Genode::Env &, Genode::Allocator &heap);
+}
+
+#endif /* _INCLUDE__FFAT__BLOCK_H_ */
diff --git a/repos/libports/run/libc_ffat_fs.run b/repos/libports/run/libc_ffat_fs.run
index 868fc8e2a6..2136a7d122 100644
--- a/repos/libports/run/libc_ffat_fs.run
+++ b/repos/libports/run/libc_ffat_fs.run
@@ -5,10 +5,11 @@
#
set use_sd_card_drv [expr [have_spec omap4] || [have_spec arndale] || [have_spec pl180]]
-set use_ahci_drv [have_spec x86]
+set use_ahci_drv [expr [have_spec x86] && ![have_spec linux]]
+set use_ram_blk [have_spec linux]
set mkfs [check_installed mkfs.vfat]
-if {[expr [have_spec linux] || [have_spec odroid_xu]]} {
+if {[have_spec odroid_xu]} {
puts "Run script does not support this platform"; exit }
#
@@ -24,6 +25,7 @@ set build_components {
lappend_if $use_ahci_drv build_components drivers/ahci
lappend_if $use_sd_card_drv build_components drivers/sd_card
+lappend_if $use_ram_blk build_components server/ram_blk
source ${genode_dir}/repos/base/run/platform_drv.inc
append_platform_drv_build_components
@@ -63,12 +65,11 @@ set config {
-
-
-
-
-
-
+
+
+
+
+
}
@@ -76,7 +77,7 @@ append_platform_drv_config
append_if $use_ahci_drv config {
-
+
@@ -91,6 +92,13 @@ append_if $use_sd_card_drv config {
}
+append_if $use_ram_blk config {
+
+
+
+
+ }
+
append config {
}
@@ -110,6 +118,8 @@ set boot_modules {
lappend_if $use_ahci_drv boot_modules ahci_drv
lappend_if $use_sd_card_drv boot_modules sd_card_drv
+lappend_if $use_ram_blk boot_modules ram_blk
+lappend_if $use_ram_blk boot_modules test.hda
append_platform_drv_boot_modules
diff --git a/repos/libports/run/libc_filesystem_test.inc b/repos/libports/run/libc_filesystem_test.inc
index c99d706e49..efd610188b 100644
--- a/repos/libports/run/libc_filesystem_test.inc
+++ b/repos/libports/run/libc_filesystem_test.inc
@@ -13,15 +13,15 @@ if {[have_spec odroid_xu] || [have_spec zynq]} {
set use_sd_card_drv [expr [have_spec omap4] || [have_spec arndale] || [have_spec pl180]]
# use AHCI on x86
-set use_ahci [have_spec x86]
+set use_ahci [expr [have_spec x86] && ![have_spec linux]]
+
+# use ram_blk on Linux
+set use_ram_blk [have_spec linux]
if {[catch { exec which $mkfs_cmd } ]} {
puts stderr "Error: $mkfs_cmd not installed, aborting test"; exit }
-if {[have_spec linux]} {
- puts "Run script does not support this platform"; exit }
-
-if {![have_include "power_on/qemu"]} {
+if {[expr ![have_include "power_on/qemu"] && !$use_ram_blk]} {
puts "\nPlease setup your native sd or hard drive. Remove this fail stop";
puts "check when you have prepared your native environment.\n";
exit 0
@@ -41,6 +41,7 @@ lappend build_components test/libc_$filesystem
lappend_if $use_ahci build_components drivers/ahci
lappend_if $use_sd_card_drv build_components drivers/sd_card
+lappend_if $use_ram_blk build_components server/ram_blk
source ${genode_dir}/repos/base/run/platform_drv.inc
append_platform_drv_build_components
@@ -82,15 +83,14 @@ append config {
append_if [have_include "power_on/qemu"] config {
}
append config {
-
-
- }
+
+
+ }
append config $libc_dev_blkdev
append config {
-
-
-
-
+
+
+
}
@@ -117,6 +117,13 @@ append_if $use_sd_card_drv config {
}
+append_if $use_ram_blk config {
+
+
+
+
+ }
+
append config {
}
@@ -139,6 +146,8 @@ append boot_modules libc_$filesystem.lib.so
lappend_if $use_ahci boot_modules ahci_drv
lappend_if $use_sd_card_drv boot_modules sd_card_drv
+lappend_if $use_ram_blk boot_modules ram_blk
+lappend_if $use_ram_blk boot_modules test.hda
append_platform_drv_boot_modules
diff --git a/repos/libports/src/lib/ffat/diskio_block.cc b/repos/libports/src/lib/ffat/diskio_block.cc
index f960015351..bd543ae121 100644
--- a/repos/libports/src/lib/ffat/diskio_block.cc
+++ b/repos/libports/src/lib/ffat/diskio_block.cc
@@ -16,20 +16,35 @@
#include
#include
+/* Genode block backend */
+#include
+
/* Ffat includes */
extern "C" {
#include
}
+namespace Ffat {
+ void block_init(Genode::Env &, Genode::Allocator &alloc);
+}
+
using namespace Genode;
static bool const verbose = false;
-static Genode::Allocator_avl _block_alloc(Genode::env()->heap());
-static Block::Connection *_block_connection;
+static Constructible _block_alloc;
+static Constructible _block_connection;
static size_t _blk_size = 0;
static Block::sector_t _blk_cnt = 0;
static Block::Session::Tx::Source *_source;
+static Genode::Env *_global_env;
+
+
+void Ffat::block_init(Genode::Env &env, Genode::Allocator &alloc)
+{
+ _global_env = &env;
+ _block_alloc.construct(&alloc);
+}
extern "C" DSTATUS disk_initialize (BYTE drv)
@@ -50,7 +65,7 @@ extern "C" DSTATUS disk_initialize (BYTE drv)
}
try {
- _block_connection = new (Genode::env()->heap()) Block::Connection(&_block_alloc);
+ _block_connection.construct(*_global_env, &*_block_alloc);
} catch(...) {
Genode::error("could not open block connection");
return STA_NOINIT;
@@ -64,7 +79,7 @@ extern "C" DSTATUS disk_initialize (BYTE drv)
/* check for read- and write-capability */
if (!ops.supported(Block::Packet_descriptor::READ)) {
Genode::error("block device not readable!");
- destroy(env()->heap(), _block_connection);
+ _block_connection.destruct();
return STA_NOINIT;
}
if (!ops.supported(Block::Packet_descriptor::WRITE)) {
diff --git a/repos/libports/src/lib/libc_ffat/plugin.cc b/repos/libports/src/lib/libc_ffat/plugin.cc
index 385592cfbd..9ddec49983 100644
--- a/repos/libports/src/lib/libc_ffat/plugin.cc
+++ b/repos/libports/src/lib/libc_ffat/plugin.cc
@@ -13,6 +13,7 @@
/* Genode includes */
#include
+#include
#include
#include
@@ -28,6 +29,9 @@
#include
#include
+/* Genode block backend */
+#include
+
/* ffat includes */
namespace Ffat { extern "C" {
#include
@@ -138,6 +142,8 @@ class Plugin : public Libc::Plugin
{
private:
+ Genode::Constructible _heap;
+
Ffat::FATFS _fatfs;
Ffat::FIL *_get_ffat_file(Libc::File_descriptor *fd)
@@ -170,8 +176,20 @@ class Plugin : public Libc::Plugin
/**
* Constructor
*/
- Plugin() : Libc::Plugin(PLUGIN_PRIORITY)
+ Plugin() : Libc::Plugin(PLUGIN_PRIORITY) { }
+
+ ~Plugin()
{
+ /* unmount the file system */
+ Ffat::f_mount(0, NULL);
+ }
+
+ void init(Genode::Env &env) override
+ {
+ _heap.construct(env.ram(), env.rm());
+
+ Ffat::block_init(env, *_heap);
+
/* mount the file system */
if (verbose)
Genode::log(__func__, ": mounting device ...");
@@ -181,12 +199,6 @@ class Plugin : public Libc::Plugin
}
}
- ~Plugin()
- {
- /* unmount the file system */
- Ffat::f_mount(0, NULL);
- }
-
/*
* TODO: decide if the file named shall be handled by this plugin
*/
@@ -251,14 +263,14 @@ class Plugin : public Libc::Plugin
if (!ffat_file){
/* directory */
- Genode::destroy(Genode::env()->heap(), context(fd));
+ Genode::destroy(&*_heap, context(fd));
Libc::file_descriptor_allocator()->free(fd);
return 0;
}
FRESULT res = f_close(ffat_file);
- Genode::destroy(Genode::env()->heap(), context(fd));
+ Genode::destroy(&*_heap, context(fd));
Libc::file_descriptor_allocator()->free(fd);
switch(res) {
@@ -513,7 +525,7 @@ class Plugin : public Libc::Plugin
switch(res) {
case FR_OK: {
- Plugin_context *context = new (Genode::env()->heap())
+ Plugin_context *context = new (&*_heap)
File_plugin_context(pathname, ffat_file);
context->status_flags(flags);
Libc::File_descriptor *fd = Libc::file_descriptor_allocator()->alloc(this, context);
@@ -533,7 +545,7 @@ class Plugin : public Libc::Plugin
Genode::log(__func__, ": opendir res=", (int)f_opendir_res);
switch(f_opendir_res) {
case FR_OK: {
- Plugin_context *context = new (Genode::env()->heap())
+ Plugin_context *context = new (&*_heap)
Directory_plugin_context(pathname, ffat_dir);
context->status_flags(flags);
Libc::File_descriptor *f =
diff --git a/repos/libports/src/server/ffat_fs/main.cc b/repos/libports/src/server/ffat_fs/main.cc
index 7731ddab72..1dbc9fe756 100644
--- a/repos/libports/src/server/ffat_fs/main.cc
+++ b/repos/libports/src/server/ffat_fs/main.cc
@@ -12,12 +12,11 @@
*/
/* Genode includes */
+#include
#include
#include
#include
-#include
#include
-#include
#include
#include
#include
@@ -28,6 +27,9 @@
#include
#include
+/* Genode block backend */
+#include
+
/* ffat includes */
namespace Ffat { extern "C" {
#include
@@ -57,12 +59,14 @@ namespace File_system {
{
private:
+ Genode::Env &_env;
+ Genode::Allocator &_heap;
+
Directory &_root;
Node_handle_registry _handle_registry;
bool _writable;
- Signal_dispatcher _process_packet_dispatcher;
-
+ Signal_handler _process_packet_dispatcher;
/******************************
** Packet-stream processing **
@@ -132,7 +136,7 @@ namespace File_system {
* Called by signal dispatcher, executed in the context of the main
* thread (not serialized with the RPC functions)
*/
- void _process_packets(unsigned)
+ void _process_packets()
{
while (tx_sink()->packet_avail()) {
@@ -171,15 +175,16 @@ namespace File_system {
/**
* Constructor
*/
- Session_component(size_t tx_buf_size, Rpc_entrypoint &ep,
- Region_map &rm,
- Signal_receiver &sig_rec,
- Directory &root, bool writable)
+ Session_component(Genode::Env &env,
+ Genode::Allocator &heap,
+ size_t tx_buf_size,
+ Directory &root,
+ bool writable)
:
- Session_rpc_object(env()->ram_session()->alloc(tx_buf_size), rm, ep),
- _root(root),
- _writable(writable),
- _process_packet_dispatcher(sig_rec, *this,
+ Session_rpc_object(env.ram().alloc(tx_buf_size),
+ env.rm(), env.ep().rpc_ep()),
+ _env(env), _heap(heap), _root(root), _writable(writable),
+ _process_packet_dispatcher(env.ep(), *this,
&Session_component::_process_packets)
{
/*
@@ -196,10 +201,9 @@ namespace File_system {
~Session_component()
{
Dataspace_capability ds = tx_sink()->dataspace();
- env()->ram_session()->free(static_cap_cast(ds));
+ _env.ram().free(static_cap_cast(ds));
}
-
/***************************
** File_system interface **
***************************/
@@ -244,7 +248,7 @@ namespace File_system {
switch(res) {
case FR_OK: {
- File *file_node = new (env()->heap()) File(absolute_path.base());
+ File *file_node = new (&_heap) File(absolute_path.base());
file_node->ffat_fil(ffat_fil);
return _handle_registry.alloc(file_node);
}
@@ -300,7 +304,7 @@ namespace File_system {
* The 'Directory' constructor removes trailing slashes,
* except for "/"
*/
- Directory *dir_node = new (env()->heap()) Directory(path.string());
+ Directory *dir_node = new (&_heap) Directory(path.string());
using namespace Ffat;
@@ -356,7 +360,7 @@ namespace File_system {
throw Lookup_failed();
}
} catch (Exception e) {
- destroy(env()->heap(), dir_node);
+ destroy(&_heap, dir_node);
throw e;
}
}
@@ -396,7 +400,7 @@ namespace File_system {
throw Lookup_failed();
}
} catch (Exception e) {
- destroy(env()->heap(), dir_node);
+ destroy(&_heap, dir_node);
throw e;
}
}
@@ -417,7 +421,7 @@ namespace File_system {
throw Lookup_failed();
}
- Node *node = new (env()->heap()) Node(absolute_path.base());
+ Node *node = new (&_heap) Node(absolute_path.base());
/* f_stat() does not work for "/" */
if (!is_root(node->name())) {
@@ -462,7 +466,7 @@ namespace File_system {
throw Lookup_failed();
}
} catch (Exception e) {
- destroy(env()->heap(), node);
+ destroy(&_heap, node);
throw e;
}
}
@@ -493,7 +497,7 @@ namespace File_system {
FRESULT res = f_close(file->ffat_fil());
/* free the node */
- destroy(env()->heap(), file);
+ destroy(&_heap, file);
switch(res) {
case FR_OK:
@@ -825,10 +829,11 @@ namespace File_system {
{
private:
- Rpc_entrypoint &_channel_ep;
- Region_map &_rm;
- Signal_receiver &_sig_rec;
- Directory &_root_dir;
+ Genode::Env &_env;
+ Genode::Allocator &_md_alloc;
+ Genode::Allocator &_heap;
+
+ Directory &_root_dir;
protected:
@@ -901,7 +906,7 @@ namespace File_system {
throw Root::Unavailable();
}
- session_root_dir = new (env()->heap()) Directory(root);
+ session_root_dir = new (&_md_alloc) Directory(root);
}
} catch (Xml_node::Nonexistent_attribute) {
error("missing \"root\" attribute in policy definition");
@@ -942,7 +947,7 @@ namespace File_system {
throw Root::Quota_exceeded();
}
return new (md_alloc())
- Session_component(tx_buf_size, _channel_ep, _rm, _sig_rec,
+ Session_component(_env, _heap, tx_buf_size,
*session_root_dir, writeable);
}
@@ -951,52 +956,52 @@ namespace File_system {
/**
* Constructor
*
- * \param session_ep session entrypoint
- * \param sig_rec signal receiver used for handling the
- * data-flow signals of packet streams
- * \param md_alloc meta-data allocator
+ * \param env reference to Genode environment
+ * \param heap meta-data allocator
+ * \param root normal root directory if root in policy starts
+ * at root
*/
- Root(Rpc_entrypoint &session_ep, Allocator &md_alloc,
- Region_map &rm,
- Signal_receiver &sig_rec, Directory &root_dir)
+ Root(Genode::Env &env, Allocator &md_alloc, Genode::Allocator &heap,
+ Directory &root)
:
- Root_component(&session_ep, &md_alloc),
- _channel_ep(session_ep), _rm(rm), _sig_rec(sig_rec),
- _root_dir(root_dir)
+ Root_component(&env.ep().rpc_ep(), &md_alloc),
+ _env(env), _md_alloc(md_alloc), _heap(heap), _root_dir(root)
{ }
};
};
-int main(int, char **)
+struct Main
{
- using namespace File_system;
- using namespace Ffat;
+ Genode::Env &_env;
+ Genode::Heap _heap { _env.ram(), _env.rm() };
+ Genode::Sliced_heap _sliced_heap { _env.ram(), _env.rm() };
- static Ffat::FATFS _fatfs;
+ File_system::Directory _root_dir { "/" };
+ File_system::Root _root { _env, _sliced_heap, _heap, _root_dir };
- /* mount the file system */
- if (f_mount(0, &_fatfs) != Ffat::FR_OK) {
- error("mount failed");
- return -1;
+ Ffat::FATFS _fatfs;
+
+ Main(Genode::Env &env) : _env(env)
+ {
+ Ffat::block_init(_env, _heap);
+
+ using namespace File_system;
+ using namespace Ffat;
+
+ /* mount the file system */
+ if (f_mount(0, &_fatfs) != Ffat::FR_OK) {
+ error("mount failed");
+
+ struct Mount_failed : Genode::Exception { };
+ throw Mount_failed();
+ }
+
+ Genode::log("--- Starting Ffat_fs ---");
+
+ _env.parent().announce(_env.ep().manage(_root));
}
+};
- enum { STACK_SIZE = 3*sizeof(addr_t)*1024 };
- static Cap_connection cap;
- static Rpc_entrypoint ep(&cap, STACK_SIZE, "ffat_fs_ep");
- static Sliced_heap sliced_heap(env()->ram_session(), env()->rm_session());
- static Signal_receiver sig_rec;
- static Directory root_dir("/");
-
- static File_system::Root root(ep, sliced_heap, *env()->rm_session(), sig_rec, root_dir);
-
- env()->parent()->announce(ep.manage(&root));
-
- for (;;) {
- Signal s = sig_rec.wait_for_signal();
- static_cast(s.context())->dispatch(s.num());
- }
-
- return 0;
-}
+void Component::construct(Genode::Env &env) { static Main main(env); }
diff --git a/repos/libports/src/server/ffat_fs/target.mk b/repos/libports/src/server/ffat_fs/target.mk
index 0ec6a59b92..bea2bf85b2 100644
--- a/repos/libports/src/server/ffat_fs/target.mk
+++ b/repos/libports/src/server/ffat_fs/target.mk
@@ -1,4 +1,4 @@
TARGET = ffat_fs
SRC_CC = main.cc
-LIBS = base ffat_block config
+LIBS = base ffat_block
INC_DIR += $(PRG_DIR)
diff --git a/repos/libports/src/test/libc_ffat/main.cc b/repos/libports/src/test/libc_ffat/main.cc
index 744f4eb273..1fc88fda13 100644
--- a/repos/libports/src/test/libc_ffat/main.cc
+++ b/repos/libports/src/test/libc_ffat/main.cc
@@ -13,7 +13,8 @@
*/
/* Genode includes */
-#include
+#include
+#include
/* libc includes */
#include
@@ -27,14 +28,27 @@
#include
-static void test_write_read()
+struct Test_failed : Genode::Exception { };
+
+#define CALL_AND_CHECK(ret, operation, condition, info_string, ...) \
+ printf("calling " #operation " " info_string "\n", ##__VA_ARGS__); \
+ ret = operation; \
+ if (condition) { \
+ printf(#operation " succeeded\n"); \
+ } else { \
+ printf(#operation " failed, " #ret "=%ld, errno=%d\n", (long)ret, errno); \
+ throw Test_failed(); \
+ }
+
+
+static void test_write_read(Genode::Xml_node node)
{
size_t rounds = 4;
size_t size = 4*1024*1024;
size_t buffer_size = 32*1024;
try {
- Genode::Xml_node config = Genode::config()->xml_node().sub_node("write-read");
+ Genode::Xml_node config = node.sub_node("write-read");
try { config.attribute("rounds").value(&rounds); } catch (...) { }
@@ -78,18 +92,7 @@ static void test_write_read()
}
-#define CALL_AND_CHECK(ret, operation, condition, info_string, ...) \
- printf("calling " #operation " " info_string "\n", ##__VA_ARGS__); \
- ret = operation; \
- if (condition) { \
- printf(#operation " succeeded\n"); \
- } else { \
- printf(#operation " failed, " #ret "=%ld, errno=%d\n", (long)ret, errno); \
- return -1; \
- }
-
-
-int main(int argc, char *argv[])
+static void test(Genode::Xml_node node)
{
int ret, fd;
ssize_t count;
@@ -108,7 +111,7 @@ int main(int argc, char *argv[])
unsigned int iterations = 1;
try {
- Genode::config()->xml_node().sub_node("iterations").attribute("value").value(&iterations);
+ node.sub_node("iterations").attribute("value").value(&iterations);
} catch(...) { }
for (unsigned int i = 0; i < iterations; i++) {
@@ -148,7 +151,7 @@ int main(int argc, char *argv[])
printf("content of file: \"%s\"\n", buf);
if (strcmp(buf, pattern) != 0) {
printf("unexpected content of file\n");
- return -1;
+ throw Test_failed();
} else {
printf("file content is correct\n");
}
@@ -176,7 +179,7 @@ int main(int argc, char *argv[])
printf("content of file: \"%s\"\n", buf);
if (strcmp(buf, &pattern[2]) != 0) {
printf("unexpected content of file\n");
- return -1;
+ throw Test_failed();
} else {
printf("file content is correct\n");
}
@@ -205,7 +208,7 @@ int main(int argc, char *argv[])
printf("content of buffer: \"%s\"\n", buf);
if (strcmp(buf, pattern) != 0) {
printf("unexpected content of file\n");
- return -1;
+ throw Test_failed();
} else {
printf("file content is correct\n");
}
@@ -234,21 +237,21 @@ int main(int argc, char *argv[])
CALL_AND_CHECK(ret, ftruncate(fd, 100), ret == 0, ""); /* increase size */
CALL_AND_CHECK(ret, close(fd), ret == 0, "");
CALL_AND_CHECK(ret, stat(file_name4, &stat_buf),
- (ret == 0) && (stat_buf.st_size == 100),
- "file_name=%s", file_name4);
+ (ret == 0) && (stat_buf.st_size == 100),
+ "file_name=%s", file_name4);
CALL_AND_CHECK(fd, open(file_name4, O_WRONLY), fd >= 0, "file_name=%s", file_name4);
CALL_AND_CHECK(ret, ftruncate(fd, 10), ret == 0, ""); /* decrease size */
CALL_AND_CHECK(ret, close(fd), ret == 0, "");
CALL_AND_CHECK(ret, stat(file_name4, &stat_buf),
- (ret == 0) && (stat_buf.st_size == 10),
- "file_name=%s", file_name4);
+ (ret == 0) && (stat_buf.st_size == 10),
+ "file_name=%s", file_name4);
/* test 'O_TRUNC' flag */
CALL_AND_CHECK(fd, open(file_name4, O_WRONLY | O_TRUNC), fd >= 0, "file_name=%s", file_name4);
CALL_AND_CHECK(ret, close(fd), ret == 0, "");
CALL_AND_CHECK(ret, stat(file_name4, &stat_buf),
- (ret == 0) && (stat_buf.st_size == 0),
- "file_name=%s", file_name4);
+ (ret == 0) && (stat_buf.st_size == 0),
+ "file_name=%s", file_name4);
/* test 'fchdir()' */
CALL_AND_CHECK(fd, open(dir_name, O_RDONLY), fd >= 0, "dir_name=%s", dir_name);
@@ -268,7 +271,7 @@ int main(int argc, char *argv[])
CALL_AND_CHECK(ret, mkdir("a", 0777), ((ret == 0) || (errno == EEXIST)), "dir_name=%s", "a");
CALL_AND_CHECK(ret, mkdir("c", 0777), ((ret == 0) || (errno == EEXIST)), "dir_name=%s", "c");
CALL_AND_CHECK(ret, symlink("../a", "c/d"),
- ((ret == 0) || (errno == EEXIST)), "dir_name=%s", "/c/d");
+ ((ret == 0) || (errno == EEXIST)), "dir_name=%s", "/c/d");
CALL_AND_CHECK(ret, symlink("c", "e"), ((ret == 0) || (errno == EEXIST)), "dir_name=%s", "e");
CALL_AND_CHECK(fd, open("a/b", O_CREAT | O_WRONLY), fd >= 0, "file_name=%s", "a/b");
@@ -281,7 +284,7 @@ int main(int argc, char *argv[])
printf("content of file: \"%s\"\n", buf);
if (strcmp(buf, pattern) != 0) {
printf("unexpected content of file\n");
- return -1;
+ throw Test_failed();
} else {
printf("file content is correct\n");
}
@@ -294,10 +297,26 @@ int main(int argc, char *argv[])
if (i < (iterations - 1))
sleep(2);
}
-
- test_write_read();
-
- printf("test finished\n");
-
- return 0;
}
+
+
+struct Main
+{
+ Main(Genode::Env &env)
+ {
+ Genode::Attached_rom_dataspace config_rom { env, "config" };
+
+ Libc::with_libc([&] () {
+
+ test(config_rom.xml());
+ test_write_read(config_rom.xml());
+
+ printf("test finished\n");
+ });
+
+ env.parent().exit(0);
+ }
+};
+
+
+void Libc::Component::construct(Libc::Env &env) { static Main main(env); }
diff --git a/repos/libports/src/test/libc_ffat/target.mk b/repos/libports/src/test/libc_ffat/target.mk
index 1e58fbbc59..3b2a9e960b 100644
--- a/repos/libports/src/test/libc_ffat/target.mk
+++ b/repos/libports/src/test/libc_ffat/target.mk
@@ -1,3 +1,3 @@
TARGET = test-libc_ffat
-LIBS = posix libc_ffat
+LIBS = libc libc_ffat
SRC_CC = main.cc
diff --git a/repos/libports/src/test/libc_vfs/target.mk b/repos/libports/src/test/libc_vfs/target.mk
index 93caeecc0a..c49e6ca3c5 100644
--- a/repos/libports/src/test/libc_vfs/target.mk
+++ b/repos/libports/src/test/libc_vfs/target.mk
@@ -1,5 +1,5 @@
TARGET = test-libc_vfs
-LIBS = posix
+LIBS = libc
SRC_CC = main.cc
# we re-use the libc_ffat test
diff --git a/repos/ports/src/test/libc_noux/target.mk b/repos/ports/src/test/libc_noux/target.mk
index 09ef4ee2e4..a707af66d7 100644
--- a/repos/ports/src/test/libc_noux/target.mk
+++ b/repos/ports/src/test/libc_noux/target.mk
@@ -1,5 +1,5 @@
TARGET = test-libc_noux
-LIBS = posix libc_noux
+LIBS = libc libc_noux
SRC_CC = main.cc
# we re-use the libc_ffat test