mirror of
https://github.com/genodelabs/genode.git
synced 2025-05-23 18:54:15 +00:00
noux: Decouple Dir_file_system from file systems
By introducing the new 'File_system_registry', we can remove the knowledge about the actual file-system implementations from the 'Dir_file_system'. Thereby the code becomes more generic, which is a precondition for using it as the basis for Genode's VFS library. Issue #999
This commit is contained in:
parent
28a5404281
commit
3bb7d4e67b
@ -271,7 +271,7 @@ namespace Noux {
|
|||||||
** File_system interface **
|
** File_system interface **
|
||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
char const *name() const { return "block"; }
|
static char const *name() { return "block"; }
|
||||||
|
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/rpc_server.h>
|
#include <base/rpc_server.h>
|
||||||
|
#include <dataspace/client.h>
|
||||||
|
|
||||||
namespace Noux {
|
namespace Noux {
|
||||||
|
|
||||||
|
@ -20,14 +20,8 @@
|
|||||||
|
|
||||||
/* Noux includes */
|
/* Noux includes */
|
||||||
#include <noux_session/sysio.h>
|
#include <noux_session/sysio.h>
|
||||||
#include <tar_file_system.h>
|
#include <file_system_registry.h>
|
||||||
#include <fs_file_system.h>
|
#include <vfs_handle.h>
|
||||||
#include <terminal_file_system.h>
|
|
||||||
#include <null_file_system.h>
|
|
||||||
#include <zero_file_system.h>
|
|
||||||
#include <stdio_file_system.h>
|
|
||||||
#include <random_file_system.h>
|
|
||||||
#include <block_file_system.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace Noux {
|
namespace Noux {
|
||||||
@ -69,7 +63,9 @@ namespace Noux {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Dir_file_system(Xml_node node) : _first_file_system(0)
|
Dir_file_system(Xml_node node, File_system_registry &fs_registry)
|
||||||
|
:
|
||||||
|
_first_file_system(0)
|
||||||
{
|
{
|
||||||
/* remember directory name */
|
/* remember directory name */
|
||||||
if (node.has_type("fstab"))
|
if (node.has_type("fstab"))
|
||||||
@ -81,59 +77,22 @@ namespace Noux {
|
|||||||
|
|
||||||
Xml_node sub_node = node.sub_node(i);
|
Xml_node sub_node = node.sub_node(i);
|
||||||
|
|
||||||
if (sub_node.has_type("tar")) {
|
|
||||||
_append_file_system(new Tar_file_system(sub_node));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sub_node.has_type("fs")) {
|
|
||||||
_append_file_system(new Fs_file_system(sub_node));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* traverse into <dir> nodes */
|
/* traverse into <dir> nodes */
|
||||||
if (sub_node.has_type("dir")) {
|
if (sub_node.has_type("dir")) {
|
||||||
_append_file_system(new Dir_file_system(sub_node));
|
_append_file_system(new Dir_file_system(sub_node,
|
||||||
|
fs_registry));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sub_node.has_type("terminal")) {
|
File_system_registry::Entry *fs = fs_registry.lookup(sub_node);
|
||||||
_append_file_system(new Terminal_file_system(sub_node));
|
if (fs) {
|
||||||
|
_append_file_system(fs->create(sub_node));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sub_node.has_type("null")) {
|
char type_name[64];
|
||||||
_append_file_system(new Null_file_system());
|
sub_node.type_name(type_name, sizeof(type_name));
|
||||||
|
PWRN("unknown fstab node type <%s>", type_name);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sub_node.has_type("zero")) {
|
|
||||||
_append_file_system(new Zero_file_system());
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sub_node.has_type("stdio")) {
|
|
||||||
_append_file_system(new Stdio_file_system(sub_node));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sub_node.has_type("random")) {
|
|
||||||
_append_file_system(new Random_file_system(0, 0));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sub_node.has_type("block")) {
|
|
||||||
_append_file_system(new Block_file_system(sub_node));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
char type_name[64];
|
|
||||||
sub_node.type_name(type_name, sizeof(type_name));
|
|
||||||
PWRN("unknown fstab node type <%s>", type_name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -660,26 +619,11 @@ namespace Noux {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Synchronize all file systems
|
* Synchronize all file systems
|
||||||
*
|
|
||||||
* Only file system using the File_system_session interface are
|
|
||||||
* synchronized.
|
|
||||||
*/
|
*/
|
||||||
void sync()
|
void sync()
|
||||||
{
|
{
|
||||||
for (File_system *fs = _first_file_system; fs; fs = fs->next) {
|
for (File_system *fs = _first_file_system; fs; fs = fs->next)
|
||||||
Fs_file_system *fs_fs = dynamic_cast<Fs_file_system *>(fs);
|
fs->sync();
|
||||||
if (fs_fs) {
|
|
||||||
fs_fs->sync();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the directory might contain Fs_file_systems */
|
|
||||||
Dir_file_system *dir_fs = dynamic_cast<Dir_file_system *>(fs);
|
|
||||||
if (dir_fs) {
|
|
||||||
dir_fs->sync();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,13 +36,6 @@ namespace Noux {
|
|||||||
|
|
||||||
File_system() : next(0) { }
|
File_system() : next(0) { }
|
||||||
|
|
||||||
/**
|
|
||||||
* Return name of file system
|
|
||||||
*
|
|
||||||
* This function is used for debugging only.
|
|
||||||
*/
|
|
||||||
virtual char const *name() const = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synchronize file system
|
* Synchronize file system
|
||||||
*
|
*
|
||||||
|
55
ports/src/noux/file_system_registry.h
Normal file
55
ports/src/noux/file_system_registry.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* \brief Registry of file systems
|
||||||
|
* \author Norman Feske
|
||||||
|
* \date 2014-04-07
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _NOUX__FILE_SYSTEM_REGISTRY_H_
|
||||||
|
#define _NOUX__FILE_SYSTEM_REGISTRY_H_
|
||||||
|
|
||||||
|
/* Noux includes */
|
||||||
|
#include <file_system.h>
|
||||||
|
|
||||||
|
namespace Noux {
|
||||||
|
|
||||||
|
class File_system_registry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
struct Entry : List<Entry>::Element
|
||||||
|
{
|
||||||
|
virtual File_system *create(Xml_node node) = 0;
|
||||||
|
|
||||||
|
virtual bool matches(Xml_node node) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
List<Entry> _list;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
void insert(Entry &entry)
|
||||||
|
{
|
||||||
|
_list.insert(&entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry *lookup(Xml_node node)
|
||||||
|
{
|
||||||
|
for (Entry *e = _list.first(); e; e = e->next())
|
||||||
|
if (e->matches(node))
|
||||||
|
return e;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _NOUX__FILE_SYSTEM_REGISTRY_H_ */
|
@ -574,7 +574,7 @@ namespace Noux {
|
|||||||
** File_system interface **
|
** File_system interface **
|
||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
char const *name() const { return "fs"; }
|
static char const *name() { return "fs"; }
|
||||||
|
|
||||||
void sync()
|
void sync()
|
||||||
{
|
{
|
||||||
|
@ -30,6 +30,17 @@
|
|||||||
#include <io_receptor_registry.h>
|
#include <io_receptor_registry.h>
|
||||||
#include <destruct_queue.h>
|
#include <destruct_queue.h>
|
||||||
#include <kill_broadcaster.h>
|
#include <kill_broadcaster.h>
|
||||||
|
#include <file_system_registry.h>
|
||||||
|
|
||||||
|
/* supported file systems */
|
||||||
|
#include <tar_file_system.h>
|
||||||
|
#include <fs_file_system.h>
|
||||||
|
#include <terminal_file_system.h>
|
||||||
|
#include <null_file_system.h>
|
||||||
|
#include <zero_file_system.h>
|
||||||
|
#include <stdio_file_system.h>
|
||||||
|
#include <random_file_system.h>
|
||||||
|
#include <block_file_system.h>
|
||||||
|
|
||||||
|
|
||||||
static const bool verbose_quota = false;
|
static const bool verbose_quota = false;
|
||||||
@ -993,6 +1004,23 @@ void *operator new (Genode::size_t size) {
|
|||||||
return Genode::env()->heap()->alloc(size); }
|
return Genode::env()->heap()->alloc(size); }
|
||||||
|
|
||||||
|
|
||||||
|
template <typename FILE_SYSTEM>
|
||||||
|
struct File_system_factory : Noux::File_system_registry::Entry
|
||||||
|
{
|
||||||
|
Noux::File_system *create(Genode::Xml_node node) override
|
||||||
|
{
|
||||||
|
return new FILE_SYSTEM(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool matches(Genode::Xml_node node) override
|
||||||
|
{
|
||||||
|
char buf[100];
|
||||||
|
node.type_name(buf, sizeof(buf));
|
||||||
|
return node.has_type(FILE_SYSTEM::name());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
using namespace Noux;
|
using namespace Noux;
|
||||||
@ -1017,9 +1045,20 @@ int main(int argc, char **argv)
|
|||||||
verbose = config()->xml_node().attribute("verbose").has_value("yes");
|
verbose = config()->xml_node().attribute("verbose").has_value("yes");
|
||||||
} catch (Xml_node::Nonexistent_attribute) { }
|
} catch (Xml_node::Nonexistent_attribute) { }
|
||||||
|
|
||||||
|
/* register file systems */
|
||||||
|
static File_system_registry fs_registry;
|
||||||
|
fs_registry.insert(*new File_system_factory<Tar_file_system>());
|
||||||
|
fs_registry.insert(*new File_system_factory<Fs_file_system>());
|
||||||
|
fs_registry.insert(*new File_system_factory<Terminal_file_system>());
|
||||||
|
fs_registry.insert(*new File_system_factory<Null_file_system>());
|
||||||
|
fs_registry.insert(*new File_system_factory<Zero_file_system>());
|
||||||
|
fs_registry.insert(*new File_system_factory<Stdio_file_system>());
|
||||||
|
fs_registry.insert(*new File_system_factory<Random_file_system>());
|
||||||
|
fs_registry.insert(*new File_system_factory<Block_file_system>());
|
||||||
|
|
||||||
/* initialize virtual file system */
|
/* initialize virtual file system */
|
||||||
static Dir_file_system
|
static Dir_file_system
|
||||||
root_dir(config()->xml_node().sub_node("fstab"));
|
root_dir(config()->xml_node().sub_node("fstab"), fs_registry);
|
||||||
|
|
||||||
/* set user information */
|
/* set user information */
|
||||||
try {
|
try {
|
||||||
|
@ -44,7 +44,7 @@ namespace Noux {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Null_file_system() { }
|
Null_file_system(Xml_node) { }
|
||||||
|
|
||||||
|
|
||||||
/*********************************
|
/*********************************
|
||||||
@ -162,7 +162,7 @@ namespace Noux {
|
|||||||
** File_system interface **
|
** File_system interface **
|
||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
char const *name() const { return "null"; }
|
static char const *name() { return "null"; }
|
||||||
|
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
|
@ -250,8 +250,10 @@ namespace Noux {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Random_file_system(void *bytes, size_t nbytes)
|
Random_file_system(Xml_node node)
|
||||||
{
|
{
|
||||||
|
void *bytes = 0;
|
||||||
|
size_t nbytes = 0;
|
||||||
_arc4random = new (env()->heap()) Arc4random(bytes, nbytes);
|
_arc4random = new (env()->heap()) Arc4random(bytes, nbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -376,7 +378,7 @@ namespace Noux {
|
|||||||
** File_system interface **
|
** File_system interface **
|
||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
char const *name() const { return "random"; }
|
static char const *name() { return "random"; }
|
||||||
|
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
|
@ -179,7 +179,7 @@ namespace Noux {
|
|||||||
** File_system interface **
|
** File_system interface **
|
||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
char const *name() const { return "stdio"; }
|
static char const *name() { return "stdio"; }
|
||||||
|
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
|
@ -606,7 +606,7 @@ namespace Noux {
|
|||||||
** File_system interface **
|
** File_system interface **
|
||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
char const *name() const { return "tar"; }
|
static char const *name() { return "tar"; }
|
||||||
|
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
|
@ -190,7 +190,7 @@ namespace Noux {
|
|||||||
** File_system interface **
|
** File_system interface **
|
||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
char const *name() const { return "terminal"; }
|
static char const *name() { return "terminal"; }
|
||||||
|
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
|
@ -44,7 +44,7 @@ namespace Noux {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Zero_file_system() { }
|
Zero_file_system(Xml_node) { }
|
||||||
|
|
||||||
|
|
||||||
/*********************************
|
/*********************************
|
||||||
@ -162,7 +162,7 @@ namespace Noux {
|
|||||||
** File_system interface **
|
** File_system interface **
|
||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
char const *name() const { return "zero"; }
|
static char const *name() { return "zero"; }
|
||||||
|
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
|
Loading…
x
Reference in New Issue
Block a user