# HG changeset patch # User Paul Boddie # Date 1616969047 -7200 # Node ID 710f4e5ca27c07d9e04dfd9642a1c1e560a6a370 # Parent bbf49114dd8a167f163e35a747bbfcdd4585df33 Moved file-related openers into the files subdirectory. diff -r bbf49114dd8a -r 710f4e5ca27c Makefile --- a/Makefile Sun Mar 28 23:16:12 2021 +0200 +++ b/Makefile Mon Mar 29 00:04:07 2021 +0200 @@ -55,7 +55,6 @@ access_map.cc accessing.cc accessor.cc \ flexpage.cc ipc.cc \ memory/memory_incremental.cc memory/memory_preallocated.cc \ - opener_resource.cc opener_context_resource.cc \ page_mapper.cc pager.cc paging.cc \ pages/page_queue.cc pages/page_queue_partitioned.cc pages/page_queue_shared.cc \ pages/pages.cc \ @@ -65,6 +64,7 @@ $(PLAIN_SRC_CC_common_server) \ dstest_block_server.cc \ files/file_pager.cc \ + files/opener_resource.cc files/opener_context_resource.cc \ files/block_file_accessor.cc files/block_file_opener.cc \ files/host_file_accessor.cc files/host_file_opener.cc @@ -72,6 +72,7 @@ $(PLAIN_SRC_CC_common_server) \ dstest_host_server.cc \ files/file_pager.cc \ + files/opener_resource.cc files/opener_context_resource.cc \ files/host_file_accessor.cc files/host_file_opener.cc PLAIN_SRC_CC_dstest_pipe_server = \ @@ -84,6 +85,7 @@ $(PLAIN_SRC_CC_common_server) \ dstest_test_server.cc \ files/file_pager.cc \ + files/opener_resource.cc files/opener_context_resource.cc \ files/test_file_accessor.cc files/test_file_opener.cc # Normal definitions. @@ -130,7 +132,8 @@ REQUIRES_LIBS = l4re_c-util libipc libstdc++ libsystypes -PRIVATE_INCDIR = $(PKGDIR) $(PKGDIR)/files $(PKGDIR)/memory \ +PRIVATE_INCDIR = $(PKGDIR) \ + $(PKGDIR)/files $(PKGDIR)/memory \ $(PKGDIR)/pages $(PKGDIR)/pipes \ $(IDL_BUILD_DIR) $(IDL_EXPORT_DIR) diff -r bbf49114dd8a -r 710f4e5ca27c files/opener_context_resource.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/files/opener_context_resource.cc Mon Mar 29 00:04:07 2021 +0200 @@ -0,0 +1,75 @@ +#include "opener_context_resource.h" +#include "opener_context_object_server.h" +#include "opener_resource.h" +#include "resource_server.h" + +#include + + + +/* Support for providing access to files. */ + +OpenerContextResource::OpenerContextResource(OpenerResource *opener, Memory *memory) +: SimplePager(memory), _opener(opener) +{ +} + +int OpenerContextResource::expected_items() +{ + return OpenerContextObject_expected_items; +} + +ipc_server_handler_type OpenerContextResource::handler() +{ + return (ipc_server_handler_type) handle_OpenerContextObject; +} + + + +/* Data access methods. */ + +char *OpenerContextResource::get_path() +{ + char *buffer = _region->read(); + offset_t size = _region->size(); + + /* Confine the path to the limit of the buffer. */ + + if ((buffer != NULL) && (strnlen(buffer, size) < size)) + return buffer; + else + return NULL; +} + + + +/* Opener context interface methods. */ + +long OpenerContextResource::open(flags_t flags, size_t *size, l4_cap_idx_t *file) +{ + char *path = get_path(); + + if (path == NULL) + return -L4_EINVAL; + + FilePager *pager = _opener->open(path, flags); + + /* Complete the initialisation and start a server in a new thread. + If the thread does not start, the resource should be finalised. */ + + ResourceServer server(pager); + long err = server.start_thread(); + + if (!err) + { + /* Return the file size. */ + /* Return the server capability to the caller. */ + + *size = pager->get_data_size(); + *file = server.config()->server; + } + + return err; +} + +// vim: tabstop=4 expandtab shiftwidth=4 diff -r bbf49114dd8a -r 710f4e5ca27c files/opener_context_resource.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/files/opener_context_resource.h Mon Mar 29 00:04:07 2021 +0200 @@ -0,0 +1,51 @@ +#pragma once + +#include "opener_context_object_interface.h" +#include "simple_pager.h" + + + +/* Forward declaration. */ + +class OpenerResource; + + + +/* Support for indicating files to be opened. */ + +class OpenerContextResource : public SimplePager, public OpenerContextObject +{ +protected: + OpenerResource *_opener; + +public: + explicit OpenerContextResource(OpenerResource *opener, Memory *memory=NULL); + + /* Server details. */ + + int expected_items(); + + ipc_server_handler_type handler(); + + void *interface() + { return static_cast(this); } + + /* Data access methods. */ + + char *get_path(); + + /* Opener context interface methods. */ + + long open(flags_t flags, size_t *size, l4_cap_idx_t *file); + + /* Pager/dataspace methods. */ + + long map(unsigned long offset, l4_addr_t hot_spot, flags_t flags, + l4_snd_fpage_t *region) + { return SimplePager::map(offset, hot_spot, flags, region); } + + long info(unsigned long *size, unsigned long *flags) + { return SimplePager::info(size, flags); } +}; + +// vim: tabstop=4 expandtab shiftwidth=4 diff -r bbf49114dd8a -r 710f4e5ca27c files/opener_resource.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/files/opener_resource.cc Mon Mar 29 00:04:07 2021 +0200 @@ -0,0 +1,96 @@ +#include "opener_server.h" +#include "opener_resource.h" +#include "resource_server.h" + +/* Support for providing access to files. */ + +OpenerResource::OpenerResource(Accessing *accessing, Paging *paging, Pages *pages) +: _accessing(accessing), _paging(paging), _pages(pages) +{ +} + +int OpenerResource::expected_items() +{ + return Opener_expected_items; +} + +ipc_server_handler_type OpenerResource::handler() +{ + return (ipc_server_handler_type) handle_Opener; +} + + + +/* Return a pager object for the given path and flags. */ + +FilePager *OpenerResource::open(const char *path, flags_t flags) +{ + fileid_t fileid = get_fileid(path); + + if (fileid == FILEID_INVALID) + return NULL; + + Accessor *accessor = get_accessor(fileid); + PageMapper *mapper = get_mapper(accessor); + return new FilePager(fileid, mapper, flags); +} + +/* Obtain an accessor for the 'fileid' or register a new one in the accessing + object. */ + +Accessor *OpenerResource::get_accessor(fileid_t fileid) +{ + Accessor *accessor; + + if (_accessing->reserve(fileid)) + accessor = _accessing->get(fileid); + else + { + accessor = make_accessor(fileid); + _accessing->set(fileid, accessor); + } + + return accessor; +} + +/* Obtain a page mapper for the 'accessor' or register a new one in the + paging object. */ + +PageMapper *OpenerResource::get_mapper(Accessor *accessor) +{ + PageMapper *mapper; + + if (_paging->reserve(accessor)) + mapper = _paging->get(accessor); + else + { + mapper = new PageMapper(accessor, _pages); + _paging->set(accessor, mapper); + } + + return mapper; +} + + + +/* Opener interface methods. */ + +long OpenerResource::context(l4_cap_idx_t *context) +{ + OpenerContextResource *resource = new OpenerContextResource(this); + + /* Complete the initialisation and start a server in a new thread. + If the thread does not start, the resource should be finalised. */ + + ResourceServer server(resource); + long err = server.start_thread(); + + /* Return the server capability to the caller. */ + + if (!err) + *context = server.config()->server; + + return err; +} + +// vim: tabstop=4 expandtab shiftwidth=4 diff -r bbf49114dd8a -r 710f4e5ca27c files/opener_resource.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/files/opener_resource.h Mon Mar 29 00:04:07 2021 +0200 @@ -0,0 +1,56 @@ +#pragma once + +#include + +#include "accessing.h" +#include "file_pager.h" +#include "opener_context_resource.h" +#include "opener_interface.h" +#include "pager.h" +#include "paging.h" +#include "pages.h" +#include "resource.h" + +/* Support for providing access to files. */ + +class OpenerResource : public Resource, public Opener +{ +protected: + Accessing *_accessing; + Paging *_paging; + Pages *_pages; + + /* Convenience methods. */ + + Accessor *get_accessor(fileid_t fileid); + + PageMapper *get_mapper(Accessor *accessor); + + /* Configurable methods. */ + + virtual fileid_t get_fileid(const char *path) = 0; + + virtual Accessor *make_accessor(fileid_t fileid) = 0; + +public: + explicit OpenerResource(Accessing *accessing, Paging *paging, Pages *pages); + + /* Server details. */ + + int expected_items(); + + ipc_server_handler_type handler(); + + void *interface() + { return static_cast(this); } + + /* Direct access methods. */ + + FilePager *open(const char *path, flags_t flags); + + /* Opener interface methods. */ + + long context(l4_cap_idx_t *context); +}; + +// vim: tabstop=4 expandtab shiftwidth=4 diff -r bbf49114dd8a -r 710f4e5ca27c opener_context_resource.cc --- a/opener_context_resource.cc Sun Mar 28 23:16:12 2021 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -#include "opener_context_resource.h" -#include "opener_context_object_server.h" -#include "opener_resource.h" -#include "resource_server.h" - -#include - - - -/* Support for providing access to files. */ - -OpenerContextResource::OpenerContextResource(OpenerResource *opener, Memory *memory) -: SimplePager(memory), _opener(opener) -{ -} - -int OpenerContextResource::expected_items() -{ - return OpenerContextObject_expected_items; -} - -ipc_server_handler_type OpenerContextResource::handler() -{ - return (ipc_server_handler_type) handle_OpenerContextObject; -} - - - -/* Data access methods. */ - -char *OpenerContextResource::get_path() -{ - char *buffer = _region->read(); - offset_t size = _region->size(); - - /* Confine the path to the limit of the buffer. */ - - if ((buffer != NULL) && (strnlen(buffer, size) < size)) - return buffer; - else - return NULL; -} - - - -/* Opener context interface methods. */ - -long OpenerContextResource::open(flags_t flags, size_t *size, l4_cap_idx_t *file) -{ - char *path = get_path(); - - if (path == NULL) - return -L4_EINVAL; - - FilePager *pager = _opener->open(path, flags); - - /* Complete the initialisation and start a server in a new thread. - If the thread does not start, the resource should be finalised. */ - - ResourceServer server(pager); - long err = server.start_thread(); - - if (!err) - { - /* Return the file size. */ - /* Return the server capability to the caller. */ - - *size = pager->get_data_size(); - *file = server.config()->server; - } - - return err; -} - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r bbf49114dd8a -r 710f4e5ca27c opener_context_resource.h --- a/opener_context_resource.h Sun Mar 28 23:16:12 2021 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -#pragma once - -#include "opener_context_object_interface.h" -#include "simple_pager.h" - - - -/* Forward declaration. */ - -class OpenerResource; - - - -/* Support for indicating files to be opened. */ - -class OpenerContextResource : public SimplePager, public OpenerContextObject -{ -protected: - OpenerResource *_opener; - -public: - explicit OpenerContextResource(OpenerResource *opener, Memory *memory=NULL); - - /* Server details. */ - - int expected_items(); - - ipc_server_handler_type handler(); - - void *interface() - { return static_cast(this); } - - /* Data access methods. */ - - char *get_path(); - - /* Opener context interface methods. */ - - long open(flags_t flags, size_t *size, l4_cap_idx_t *file); - - /* Pager/dataspace methods. */ - - long map(unsigned long offset, l4_addr_t hot_spot, flags_t flags, - l4_snd_fpage_t *region) - { return SimplePager::map(offset, hot_spot, flags, region); } - - long info(unsigned long *size, unsigned long *flags) - { return SimplePager::info(size, flags); } -}; - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r bbf49114dd8a -r 710f4e5ca27c opener_resource.cc --- a/opener_resource.cc Sun Mar 28 23:16:12 2021 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -#include "opener_server.h" -#include "opener_resource.h" -#include "resource_server.h" - -/* Support for providing access to files. */ - -OpenerResource::OpenerResource(Accessing *accessing, Paging *paging, Pages *pages) -: _accessing(accessing), _paging(paging), _pages(pages) -{ -} - -int OpenerResource::expected_items() -{ - return Opener_expected_items; -} - -ipc_server_handler_type OpenerResource::handler() -{ - return (ipc_server_handler_type) handle_Opener; -} - - - -/* Return a pager object for the given path and flags. */ - -FilePager *OpenerResource::open(const char *path, flags_t flags) -{ - fileid_t fileid = get_fileid(path); - - if (fileid == FILEID_INVALID) - return NULL; - - Accessor *accessor = get_accessor(fileid); - PageMapper *mapper = get_mapper(accessor); - return new FilePager(fileid, mapper, flags); -} - -/* Obtain an accessor for the 'fileid' or register a new one in the accessing - object. */ - -Accessor *OpenerResource::get_accessor(fileid_t fileid) -{ - Accessor *accessor; - - if (_accessing->reserve(fileid)) - accessor = _accessing->get(fileid); - else - { - accessor = make_accessor(fileid); - _accessing->set(fileid, accessor); - } - - return accessor; -} - -/* Obtain a page mapper for the 'accessor' or register a new one in the - paging object. */ - -PageMapper *OpenerResource::get_mapper(Accessor *accessor) -{ - PageMapper *mapper; - - if (_paging->reserve(accessor)) - mapper = _paging->get(accessor); - else - { - mapper = new PageMapper(accessor, _pages); - _paging->set(accessor, mapper); - } - - return mapper; -} - - - -/* Opener interface methods. */ - -long OpenerResource::context(l4_cap_idx_t *context) -{ - OpenerContextResource *resource = new OpenerContextResource(this); - - /* Complete the initialisation and start a server in a new thread. - If the thread does not start, the resource should be finalised. */ - - ResourceServer server(resource); - long err = server.start_thread(); - - /* Return the server capability to the caller. */ - - if (!err) - *context = server.config()->server; - - return err; -} - -// vim: tabstop=4 expandtab shiftwidth=4 diff -r bbf49114dd8a -r 710f4e5ca27c opener_resource.h --- a/opener_resource.h Sun Mar 28 23:16:12 2021 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -#pragma once - -#include - -#include "accessing.h" -#include "file_pager.h" -#include "opener_context_resource.h" -#include "opener_interface.h" -#include "pager.h" -#include "paging.h" -#include "pages.h" -#include "resource.h" - -/* Support for providing access to files. */ - -class OpenerResource : public Resource, public Opener -{ -protected: - Accessing *_accessing; - Paging *_paging; - Pages *_pages; - - /* Convenience methods. */ - - Accessor *get_accessor(fileid_t fileid); - - PageMapper *get_mapper(Accessor *accessor); - - /* Configurable methods. */ - - virtual fileid_t get_fileid(const char *path) = 0; - - virtual Accessor *make_accessor(fileid_t fileid) = 0; - -public: - explicit OpenerResource(Accessing *accessing, Paging *paging, Pages *pages); - - /* Server details. */ - - int expected_items(); - - ipc_server_handler_type handler(); - - void *interface() - { return static_cast(this); } - - /* Direct access methods. */ - - FilePager *open(const char *path, flags_t flags); - - /* Opener interface methods. */ - - long context(l4_cap_idx_t *context); -}; - -// vim: tabstop=4 expandtab shiftwidth=4