1.1 --- a/Makefile Sun Mar 28 23:16:12 2021 +0200
1.2 +++ b/Makefile Mon Mar 29 00:04:07 2021 +0200
1.3 @@ -55,7 +55,6 @@
1.4 access_map.cc accessing.cc accessor.cc \
1.5 flexpage.cc ipc.cc \
1.6 memory/memory_incremental.cc memory/memory_preallocated.cc \
1.7 - opener_resource.cc opener_context_resource.cc \
1.8 page_mapper.cc pager.cc paging.cc \
1.9 pages/page_queue.cc pages/page_queue_partitioned.cc pages/page_queue_shared.cc \
1.10 pages/pages.cc \
1.11 @@ -65,6 +64,7 @@
1.12 $(PLAIN_SRC_CC_common_server) \
1.13 dstest_block_server.cc \
1.14 files/file_pager.cc \
1.15 + files/opener_resource.cc files/opener_context_resource.cc \
1.16 files/block_file_accessor.cc files/block_file_opener.cc \
1.17 files/host_file_accessor.cc files/host_file_opener.cc
1.18
1.19 @@ -72,6 +72,7 @@
1.20 $(PLAIN_SRC_CC_common_server) \
1.21 dstest_host_server.cc \
1.22 files/file_pager.cc \
1.23 + files/opener_resource.cc files/opener_context_resource.cc \
1.24 files/host_file_accessor.cc files/host_file_opener.cc
1.25
1.26 PLAIN_SRC_CC_dstest_pipe_server = \
1.27 @@ -84,6 +85,7 @@
1.28 $(PLAIN_SRC_CC_common_server) \
1.29 dstest_test_server.cc \
1.30 files/file_pager.cc \
1.31 + files/opener_resource.cc files/opener_context_resource.cc \
1.32 files/test_file_accessor.cc files/test_file_opener.cc
1.33
1.34 # Normal definitions.
1.35 @@ -130,7 +132,8 @@
1.36
1.37 REQUIRES_LIBS = l4re_c-util libipc libstdc++ libsystypes
1.38
1.39 -PRIVATE_INCDIR = $(PKGDIR) $(PKGDIR)/files $(PKGDIR)/memory \
1.40 +PRIVATE_INCDIR = $(PKGDIR) \
1.41 + $(PKGDIR)/files $(PKGDIR)/memory \
1.42 $(PKGDIR)/pages $(PKGDIR)/pipes \
1.43 $(IDL_BUILD_DIR) $(IDL_EXPORT_DIR)
1.44
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/files/opener_context_resource.cc Mon Mar 29 00:04:07 2021 +0200
2.3 @@ -0,0 +1,75 @@
2.4 +#include "opener_context_resource.h"
2.5 +#include "opener_context_object_server.h"
2.6 +#include "opener_resource.h"
2.7 +#include "resource_server.h"
2.8 +
2.9 +#include <string.h>
2.10 +
2.11 +
2.12 +
2.13 +/* Support for providing access to files. */
2.14 +
2.15 +OpenerContextResource::OpenerContextResource(OpenerResource *opener, Memory *memory)
2.16 +: SimplePager(memory), _opener(opener)
2.17 +{
2.18 +}
2.19 +
2.20 +int OpenerContextResource::expected_items()
2.21 +{
2.22 + return OpenerContextObject_expected_items;
2.23 +}
2.24 +
2.25 +ipc_server_handler_type OpenerContextResource::handler()
2.26 +{
2.27 + return (ipc_server_handler_type) handle_OpenerContextObject;
2.28 +}
2.29 +
2.30 +
2.31 +
2.32 +/* Data access methods. */
2.33 +
2.34 +char *OpenerContextResource::get_path()
2.35 +{
2.36 + char *buffer = _region->read();
2.37 + offset_t size = _region->size();
2.38 +
2.39 + /* Confine the path to the limit of the buffer. */
2.40 +
2.41 + if ((buffer != NULL) && (strnlen(buffer, size) < size))
2.42 + return buffer;
2.43 + else
2.44 + return NULL;
2.45 +}
2.46 +
2.47 +
2.48 +
2.49 +/* Opener context interface methods. */
2.50 +
2.51 +long OpenerContextResource::open(flags_t flags, size_t *size, l4_cap_idx_t *file)
2.52 +{
2.53 + char *path = get_path();
2.54 +
2.55 + if (path == NULL)
2.56 + return -L4_EINVAL;
2.57 +
2.58 + FilePager *pager = _opener->open(path, flags);
2.59 +
2.60 + /* Complete the initialisation and start a server in a new thread.
2.61 + If the thread does not start, the resource should be finalised. */
2.62 +
2.63 + ResourceServer server(pager);
2.64 + long err = server.start_thread();
2.65 +
2.66 + if (!err)
2.67 + {
2.68 + /* Return the file size. */
2.69 + /* Return the server capability to the caller. */
2.70 +
2.71 + *size = pager->get_data_size();
2.72 + *file = server.config()->server;
2.73 + }
2.74 +
2.75 + return err;
2.76 +}
2.77 +
2.78 +// vim: tabstop=4 expandtab shiftwidth=4
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/files/opener_context_resource.h Mon Mar 29 00:04:07 2021 +0200
3.3 @@ -0,0 +1,51 @@
3.4 +#pragma once
3.5 +
3.6 +#include "opener_context_object_interface.h"
3.7 +#include "simple_pager.h"
3.8 +
3.9 +
3.10 +
3.11 +/* Forward declaration. */
3.12 +
3.13 +class OpenerResource;
3.14 +
3.15 +
3.16 +
3.17 +/* Support for indicating files to be opened. */
3.18 +
3.19 +class OpenerContextResource : public SimplePager, public OpenerContextObject
3.20 +{
3.21 +protected:
3.22 + OpenerResource *_opener;
3.23 +
3.24 +public:
3.25 + explicit OpenerContextResource(OpenerResource *opener, Memory *memory=NULL);
3.26 +
3.27 + /* Server details. */
3.28 +
3.29 + int expected_items();
3.30 +
3.31 + ipc_server_handler_type handler();
3.32 +
3.33 + void *interface()
3.34 + { return static_cast<OpenerContextObject *>(this); }
3.35 +
3.36 + /* Data access methods. */
3.37 +
3.38 + char *get_path();
3.39 +
3.40 + /* Opener context interface methods. */
3.41 +
3.42 + long open(flags_t flags, size_t *size, l4_cap_idx_t *file);
3.43 +
3.44 + /* Pager/dataspace methods. */
3.45 +
3.46 + long map(unsigned long offset, l4_addr_t hot_spot, flags_t flags,
3.47 + l4_snd_fpage_t *region)
3.48 + { return SimplePager::map(offset, hot_spot, flags, region); }
3.49 +
3.50 + long info(unsigned long *size, unsigned long *flags)
3.51 + { return SimplePager::info(size, flags); }
3.52 +};
3.53 +
3.54 +// vim: tabstop=4 expandtab shiftwidth=4
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
4.2 +++ b/files/opener_resource.cc Mon Mar 29 00:04:07 2021 +0200
4.3 @@ -0,0 +1,96 @@
4.4 +#include "opener_server.h"
4.5 +#include "opener_resource.h"
4.6 +#include "resource_server.h"
4.7 +
4.8 +/* Support for providing access to files. */
4.9 +
4.10 +OpenerResource::OpenerResource(Accessing *accessing, Paging *paging, Pages *pages)
4.11 +: _accessing(accessing), _paging(paging), _pages(pages)
4.12 +{
4.13 +}
4.14 +
4.15 +int OpenerResource::expected_items()
4.16 +{
4.17 + return Opener_expected_items;
4.18 +}
4.19 +
4.20 +ipc_server_handler_type OpenerResource::handler()
4.21 +{
4.22 + return (ipc_server_handler_type) handle_Opener;
4.23 +}
4.24 +
4.25 +
4.26 +
4.27 +/* Return a pager object for the given path and flags. */
4.28 +
4.29 +FilePager *OpenerResource::open(const char *path, flags_t flags)
4.30 +{
4.31 + fileid_t fileid = get_fileid(path);
4.32 +
4.33 + if (fileid == FILEID_INVALID)
4.34 + return NULL;
4.35 +
4.36 + Accessor *accessor = get_accessor(fileid);
4.37 + PageMapper *mapper = get_mapper(accessor);
4.38 + return new FilePager(fileid, mapper, flags);
4.39 +}
4.40 +
4.41 +/* Obtain an accessor for the 'fileid' or register a new one in the accessing
4.42 + object. */
4.43 +
4.44 +Accessor *OpenerResource::get_accessor(fileid_t fileid)
4.45 +{
4.46 + Accessor *accessor;
4.47 +
4.48 + if (_accessing->reserve(fileid))
4.49 + accessor = _accessing->get(fileid);
4.50 + else
4.51 + {
4.52 + accessor = make_accessor(fileid);
4.53 + _accessing->set(fileid, accessor);
4.54 + }
4.55 +
4.56 + return accessor;
4.57 +}
4.58 +
4.59 +/* Obtain a page mapper for the 'accessor' or register a new one in the
4.60 + paging object. */
4.61 +
4.62 +PageMapper *OpenerResource::get_mapper(Accessor *accessor)
4.63 +{
4.64 + PageMapper *mapper;
4.65 +
4.66 + if (_paging->reserve(accessor))
4.67 + mapper = _paging->get(accessor);
4.68 + else
4.69 + {
4.70 + mapper = new PageMapper(accessor, _pages);
4.71 + _paging->set(accessor, mapper);
4.72 + }
4.73 +
4.74 + return mapper;
4.75 +}
4.76 +
4.77 +
4.78 +
4.79 +/* Opener interface methods. */
4.80 +
4.81 +long OpenerResource::context(l4_cap_idx_t *context)
4.82 +{
4.83 + OpenerContextResource *resource = new OpenerContextResource(this);
4.84 +
4.85 + /* Complete the initialisation and start a server in a new thread.
4.86 + If the thread does not start, the resource should be finalised. */
4.87 +
4.88 + ResourceServer server(resource);
4.89 + long err = server.start_thread();
4.90 +
4.91 + /* Return the server capability to the caller. */
4.92 +
4.93 + if (!err)
4.94 + *context = server.config()->server;
4.95 +
4.96 + return err;
4.97 +}
4.98 +
4.99 +// vim: tabstop=4 expandtab shiftwidth=4
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
5.2 +++ b/files/opener_resource.h Mon Mar 29 00:04:07 2021 +0200
5.3 @@ -0,0 +1,56 @@
5.4 +#pragma once
5.5 +
5.6 +#include <l4/sys/ipc.h>
5.7 +
5.8 +#include "accessing.h"
5.9 +#include "file_pager.h"
5.10 +#include "opener_context_resource.h"
5.11 +#include "opener_interface.h"
5.12 +#include "pager.h"
5.13 +#include "paging.h"
5.14 +#include "pages.h"
5.15 +#include "resource.h"
5.16 +
5.17 +/* Support for providing access to files. */
5.18 +
5.19 +class OpenerResource : public Resource, public Opener
5.20 +{
5.21 +protected:
5.22 + Accessing *_accessing;
5.23 + Paging *_paging;
5.24 + Pages *_pages;
5.25 +
5.26 + /* Convenience methods. */
5.27 +
5.28 + Accessor *get_accessor(fileid_t fileid);
5.29 +
5.30 + PageMapper *get_mapper(Accessor *accessor);
5.31 +
5.32 + /* Configurable methods. */
5.33 +
5.34 + virtual fileid_t get_fileid(const char *path) = 0;
5.35 +
5.36 + virtual Accessor *make_accessor(fileid_t fileid) = 0;
5.37 +
5.38 +public:
5.39 + explicit OpenerResource(Accessing *accessing, Paging *paging, Pages *pages);
5.40 +
5.41 + /* Server details. */
5.42 +
5.43 + int expected_items();
5.44 +
5.45 + ipc_server_handler_type handler();
5.46 +
5.47 + void *interface()
5.48 + { return static_cast<Opener *>(this); }
5.49 +
5.50 + /* Direct access methods. */
5.51 +
5.52 + FilePager *open(const char *path, flags_t flags);
5.53 +
5.54 + /* Opener interface methods. */
5.55 +
5.56 + long context(l4_cap_idx_t *context);
5.57 +};
5.58 +
5.59 +// vim: tabstop=4 expandtab shiftwidth=4
6.1 --- a/opener_context_resource.cc Sun Mar 28 23:16:12 2021 +0200
6.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
6.3 @@ -1,75 +0,0 @@
6.4 -#include "opener_context_resource.h"
6.5 -#include "opener_context_object_server.h"
6.6 -#include "opener_resource.h"
6.7 -#include "resource_server.h"
6.8 -
6.9 -#include <string.h>
6.10 -
6.11 -
6.12 -
6.13 -/* Support for providing access to files. */
6.14 -
6.15 -OpenerContextResource::OpenerContextResource(OpenerResource *opener, Memory *memory)
6.16 -: SimplePager(memory), _opener(opener)
6.17 -{
6.18 -}
6.19 -
6.20 -int OpenerContextResource::expected_items()
6.21 -{
6.22 - return OpenerContextObject_expected_items;
6.23 -}
6.24 -
6.25 -ipc_server_handler_type OpenerContextResource::handler()
6.26 -{
6.27 - return (ipc_server_handler_type) handle_OpenerContextObject;
6.28 -}
6.29 -
6.30 -
6.31 -
6.32 -/* Data access methods. */
6.33 -
6.34 -char *OpenerContextResource::get_path()
6.35 -{
6.36 - char *buffer = _region->read();
6.37 - offset_t size = _region->size();
6.38 -
6.39 - /* Confine the path to the limit of the buffer. */
6.40 -
6.41 - if ((buffer != NULL) && (strnlen(buffer, size) < size))
6.42 - return buffer;
6.43 - else
6.44 - return NULL;
6.45 -}
6.46 -
6.47 -
6.48 -
6.49 -/* Opener context interface methods. */
6.50 -
6.51 -long OpenerContextResource::open(flags_t flags, size_t *size, l4_cap_idx_t *file)
6.52 -{
6.53 - char *path = get_path();
6.54 -
6.55 - if (path == NULL)
6.56 - return -L4_EINVAL;
6.57 -
6.58 - FilePager *pager = _opener->open(path, flags);
6.59 -
6.60 - /* Complete the initialisation and start a server in a new thread.
6.61 - If the thread does not start, the resource should be finalised. */
6.62 -
6.63 - ResourceServer server(pager);
6.64 - long err = server.start_thread();
6.65 -
6.66 - if (!err)
6.67 - {
6.68 - /* Return the file size. */
6.69 - /* Return the server capability to the caller. */
6.70 -
6.71 - *size = pager->get_data_size();
6.72 - *file = server.config()->server;
6.73 - }
6.74 -
6.75 - return err;
6.76 -}
6.77 -
6.78 -// vim: tabstop=4 expandtab shiftwidth=4
7.1 --- a/opener_context_resource.h Sun Mar 28 23:16:12 2021 +0200
7.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
7.3 @@ -1,51 +0,0 @@
7.4 -#pragma once
7.5 -
7.6 -#include "opener_context_object_interface.h"
7.7 -#include "simple_pager.h"
7.8 -
7.9 -
7.10 -
7.11 -/* Forward declaration. */
7.12 -
7.13 -class OpenerResource;
7.14 -
7.15 -
7.16 -
7.17 -/* Support for indicating files to be opened. */
7.18 -
7.19 -class OpenerContextResource : public SimplePager, public OpenerContextObject
7.20 -{
7.21 -protected:
7.22 - OpenerResource *_opener;
7.23 -
7.24 -public:
7.25 - explicit OpenerContextResource(OpenerResource *opener, Memory *memory=NULL);
7.26 -
7.27 - /* Server details. */
7.28 -
7.29 - int expected_items();
7.30 -
7.31 - ipc_server_handler_type handler();
7.32 -
7.33 - void *interface()
7.34 - { return static_cast<OpenerContextObject *>(this); }
7.35 -
7.36 - /* Data access methods. */
7.37 -
7.38 - char *get_path();
7.39 -
7.40 - /* Opener context interface methods. */
7.41 -
7.42 - long open(flags_t flags, size_t *size, l4_cap_idx_t *file);
7.43 -
7.44 - /* Pager/dataspace methods. */
7.45 -
7.46 - long map(unsigned long offset, l4_addr_t hot_spot, flags_t flags,
7.47 - l4_snd_fpage_t *region)
7.48 - { return SimplePager::map(offset, hot_spot, flags, region); }
7.49 -
7.50 - long info(unsigned long *size, unsigned long *flags)
7.51 - { return SimplePager::info(size, flags); }
7.52 -};
7.53 -
7.54 -// vim: tabstop=4 expandtab shiftwidth=4
8.1 --- a/opener_resource.cc Sun Mar 28 23:16:12 2021 +0200
8.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
8.3 @@ -1,96 +0,0 @@
8.4 -#include "opener_server.h"
8.5 -#include "opener_resource.h"
8.6 -#include "resource_server.h"
8.7 -
8.8 -/* Support for providing access to files. */
8.9 -
8.10 -OpenerResource::OpenerResource(Accessing *accessing, Paging *paging, Pages *pages)
8.11 -: _accessing(accessing), _paging(paging), _pages(pages)
8.12 -{
8.13 -}
8.14 -
8.15 -int OpenerResource::expected_items()
8.16 -{
8.17 - return Opener_expected_items;
8.18 -}
8.19 -
8.20 -ipc_server_handler_type OpenerResource::handler()
8.21 -{
8.22 - return (ipc_server_handler_type) handle_Opener;
8.23 -}
8.24 -
8.25 -
8.26 -
8.27 -/* Return a pager object for the given path and flags. */
8.28 -
8.29 -FilePager *OpenerResource::open(const char *path, flags_t flags)
8.30 -{
8.31 - fileid_t fileid = get_fileid(path);
8.32 -
8.33 - if (fileid == FILEID_INVALID)
8.34 - return NULL;
8.35 -
8.36 - Accessor *accessor = get_accessor(fileid);
8.37 - PageMapper *mapper = get_mapper(accessor);
8.38 - return new FilePager(fileid, mapper, flags);
8.39 -}
8.40 -
8.41 -/* Obtain an accessor for the 'fileid' or register a new one in the accessing
8.42 - object. */
8.43 -
8.44 -Accessor *OpenerResource::get_accessor(fileid_t fileid)
8.45 -{
8.46 - Accessor *accessor;
8.47 -
8.48 - if (_accessing->reserve(fileid))
8.49 - accessor = _accessing->get(fileid);
8.50 - else
8.51 - {
8.52 - accessor = make_accessor(fileid);
8.53 - _accessing->set(fileid, accessor);
8.54 - }
8.55 -
8.56 - return accessor;
8.57 -}
8.58 -
8.59 -/* Obtain a page mapper for the 'accessor' or register a new one in the
8.60 - paging object. */
8.61 -
8.62 -PageMapper *OpenerResource::get_mapper(Accessor *accessor)
8.63 -{
8.64 - PageMapper *mapper;
8.65 -
8.66 - if (_paging->reserve(accessor))
8.67 - mapper = _paging->get(accessor);
8.68 - else
8.69 - {
8.70 - mapper = new PageMapper(accessor, _pages);
8.71 - _paging->set(accessor, mapper);
8.72 - }
8.73 -
8.74 - return mapper;
8.75 -}
8.76 -
8.77 -
8.78 -
8.79 -/* Opener interface methods. */
8.80 -
8.81 -long OpenerResource::context(l4_cap_idx_t *context)
8.82 -{
8.83 - OpenerContextResource *resource = new OpenerContextResource(this);
8.84 -
8.85 - /* Complete the initialisation and start a server in a new thread.
8.86 - If the thread does not start, the resource should be finalised. */
8.87 -
8.88 - ResourceServer server(resource);
8.89 - long err = server.start_thread();
8.90 -
8.91 - /* Return the server capability to the caller. */
8.92 -
8.93 - if (!err)
8.94 - *context = server.config()->server;
8.95 -
8.96 - return err;
8.97 -}
8.98 -
8.99 -// vim: tabstop=4 expandtab shiftwidth=4
9.1 --- a/opener_resource.h Sun Mar 28 23:16:12 2021 +0200
9.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
9.3 @@ -1,56 +0,0 @@
9.4 -#pragma once
9.5 -
9.6 -#include <l4/sys/ipc.h>
9.7 -
9.8 -#include "accessing.h"
9.9 -#include "file_pager.h"
9.10 -#include "opener_context_resource.h"
9.11 -#include "opener_interface.h"
9.12 -#include "pager.h"
9.13 -#include "paging.h"
9.14 -#include "pages.h"
9.15 -#include "resource.h"
9.16 -
9.17 -/* Support for providing access to files. */
9.18 -
9.19 -class OpenerResource : public Resource, public Opener
9.20 -{
9.21 -protected:
9.22 - Accessing *_accessing;
9.23 - Paging *_paging;
9.24 - Pages *_pages;
9.25 -
9.26 - /* Convenience methods. */
9.27 -
9.28 - Accessor *get_accessor(fileid_t fileid);
9.29 -
9.30 - PageMapper *get_mapper(Accessor *accessor);
9.31 -
9.32 - /* Configurable methods. */
9.33 -
9.34 - virtual fileid_t get_fileid(const char *path) = 0;
9.35 -
9.36 - virtual Accessor *make_accessor(fileid_t fileid) = 0;
9.37 -
9.38 -public:
9.39 - explicit OpenerResource(Accessing *accessing, Paging *paging, Pages *pages);
9.40 -
9.41 - /* Server details. */
9.42 -
9.43 - int expected_items();
9.44 -
9.45 - ipc_server_handler_type handler();
9.46 -
9.47 - void *interface()
9.48 - { return static_cast<Opener *>(this); }
9.49 -
9.50 - /* Direct access methods. */
9.51 -
9.52 - FilePager *open(const char *path, flags_t flags);
9.53 -
9.54 - /* Opener interface methods. */
9.55 -
9.56 - long context(l4_cap_idx_t *context);
9.57 -};
9.58 -
9.59 -// vim: tabstop=4 expandtab shiftwidth=4