1.1 --- a/libfsserver/include/fsserver/directory_provider.h Sun Oct 17 18:48:30 2021 +0200 1.2 +++ b/libfsserver/include/fsserver/directory_provider.h Sun Oct 17 21:55:37 2021 +0200 1.3 @@ -34,11 +34,15 @@ 1.4 DirectoryAccessor *_accessor; 1.5 1.6 public: 1.7 - explicit DirectoryProvider(DirectoryAccessor *accessor); 1.8 + explicit DirectoryProvider(fileid_t fileid, FileRegistry *registry, 1.9 + DirectoryAccessor *accessor); 1.10 1.11 virtual ~DirectoryProvider(); 1.12 1.13 virtual DirectoryAccessor *accessor(); 1.14 + 1.15 + virtual long make_resource(offset_t *size, object_flags_t *object_flags, 1.16 + Resource **resource); 1.17 }; 1.18 1.19 // vim: tabstop=4 expandtab shiftwidth=4
2.1 --- a/libfsserver/include/fsserver/file_object_registry.h Sun Oct 17 18:48:30 2021 +0200 2.2 +++ b/libfsserver/include/fsserver/file_object_registry.h Sun Oct 17 21:55:37 2021 +0200 2.3 @@ -53,21 +53,6 @@ 2.4 flags_t flags, fileid_t fileid, 2.5 Provider **provider); 2.6 2.7 - /* Resource initialisation methods. */ 2.8 - 2.9 - long make_directory_resource(fileid_t fileid, offset_t *size, 2.10 - object_flags_t *object_flags, 2.11 - DirectoryProvider *provider, 2.12 - Resource **resource); 2.13 - 2.14 - long make_file_resource(flags_t flags, fileid_t fileid, offset_t *size, 2.15 - object_flags_t *object_flags, 2.16 - FileProvider *provider, Resource **resource); 2.17 - 2.18 - long make_resource(flags_t flags, fileid_t fileid, offset_t *size, 2.19 - object_flags_t *object_flags, 2.20 - Provider *provider, Resource **resource); 2.21 - 2.22 public: 2.23 explicit FileObjectRegistry(Pages *pages); 2.24
3.1 --- a/libfsserver/include/fsserver/file_provider.h Sun Oct 17 18:48:30 2021 +0200 3.2 +++ b/libfsserver/include/fsserver/file_provider.h Sun Oct 17 21:55:37 2021 +0200 3.3 @@ -31,14 +31,19 @@ 3.4 class FileProvider : public Provider 3.5 { 3.6 protected: 3.7 + map_flags_t _flags; 3.8 PageMapper *_mapper; 3.9 3.10 public: 3.11 - explicit FileProvider(PageMapper *mapper); 3.12 + explicit FileProvider(fileid_t fileid, map_flags_t flags, 3.13 + FileRegistry *registry, PageMapper *mapper); 3.14 3.15 virtual ~FileProvider(); 3.16 3.17 - PageMapper *mapper(); 3.18 + virtual PageMapper *mapper(); 3.19 + 3.20 + virtual long make_resource(offset_t *size, object_flags_t *object_flags, 3.21 + Resource **resource); 3.22 }; 3.23 3.24 // vim: tabstop=4 expandtab shiftwidth=4
4.1 --- a/libfsserver/include/fsserver/provider.h Sun Oct 17 18:48:30 2021 +0200 4.2 +++ b/libfsserver/include/fsserver/provider.h Sun Oct 17 21:55:37 2021 +0200 4.3 @@ -22,7 +22,9 @@ 4.4 #pragma once 4.5 4.6 #include <fsserver/accountable.h> 4.7 +#include <fsserver/file_registry.h> 4.8 #include <fsserver/notification.h> 4.9 +#include <fsserver/resource.h> 4.10 4.11 4.12 4.13 @@ -30,8 +32,17 @@ 4.14 4.15 class Provider : public NotificationSupport, public Accountable 4.16 { 4.17 +protected: 4.18 + fileid_t _fileid; 4.19 + FileRegistry *_registry; 4.20 + 4.21 public: 4.22 - explicit Provider(); 4.23 + explicit Provider(fileid_t fileid, FileRegistry *registry); 4.24 + 4.25 + virtual ~Provider(); 4.26 + 4.27 + virtual long make_resource(offset_t *size, object_flags_t *object_flags, 4.28 + Resource **resource) = 0; 4.29 }; 4.30 4.31 // vim: tabstop=4 expandtab shiftwidth=4
5.1 --- a/libfsserver/lib/directories/directory_provider.cc Sun Oct 17 18:48:30 2021 +0200 5.2 +++ b/libfsserver/lib/directories/directory_provider.cc Sun Oct 17 21:55:37 2021 +0200 5.3 @@ -20,13 +20,15 @@ 5.4 */ 5.5 5.6 #include "directory_provider.h" 5.7 +#include "directory_resource.h" 5.8 5.9 5.10 5.11 /* Initialise the provider. */ 5.12 5.13 -DirectoryProvider::DirectoryProvider(DirectoryAccessor *accessor) 5.14 -: Provider(), _accessor(accessor) 5.15 +DirectoryProvider::DirectoryProvider(fileid_t fileid, FileRegistry *registry, 5.16 + DirectoryAccessor *accessor) 5.17 +: Provider(fileid, registry), _accessor(accessor) 5.18 { 5.19 } 5.20 5.21 @@ -43,4 +45,23 @@ 5.22 return _accessor; 5.23 } 5.24 5.25 +/* Return a directory resource initialised with this provider. */ 5.26 + 5.27 +long DirectoryProvider::make_resource(offset_t *size, 5.28 + object_flags_t *object_flags, 5.29 + Resource **resource) 5.30 +{ 5.31 + /* Provide non-file values for certain outputs. */ 5.32 + 5.33 + *size = 0; 5.34 + *object_flags = 0; 5.35 + 5.36 + /* Initialise the resource with the provider and a reference to the registry 5.37 + for detaching from the provider. */ 5.38 + 5.39 + this->attach(); 5.40 + *resource = new DirectoryResource(_fileid, this, _registry); 5.41 + return L4_EOK; 5.42 +} 5.43 + 5.44 // vim: tabstop=4 expandtab shiftwidth=4
6.1 --- a/libfsserver/lib/files/file_object_registry.cc Sun Oct 17 18:48:30 2021 +0200 6.2 +++ b/libfsserver/lib/files/file_object_registry.cc Sun Oct 17 21:55:37 2021 +0200 6.3 @@ -61,7 +61,7 @@ 6.4 if (err) 6.5 return err; 6.6 6.7 - *provider = new DirectoryProvider(accessor); 6.8 + *provider = new DirectoryProvider(fileid, this, accessor); 6.9 6.10 /* Register the provider. */ 6.11 6.12 @@ -85,7 +85,7 @@ 6.13 return err; 6.14 6.15 PageMapper *mapper = new PageMapper(accessor, _pages); 6.16 - *provider = new FileProvider(mapper); 6.17 + *provider = new FileProvider(fileid, get_flags(flags), this, mapper); 6.18 6.19 /* Register the provider. */ 6.20 6.21 @@ -110,72 +110,6 @@ 6.22 6.23 6.24 6.25 -/* Return a directory resource initialised with a provider. */ 6.26 - 6.27 -long FileObjectRegistry::make_directory_resource(fileid_t fileid, offset_t *size, 6.28 - object_flags_t *object_flags, 6.29 - DirectoryProvider *provider, 6.30 - Resource **resource) 6.31 -{ 6.32 - /* Provide non-file values for certain outputs. */ 6.33 - 6.34 - *size = 0; 6.35 - *object_flags = 0; 6.36 - 6.37 - /* Initialise the resource with the provider and a reference to this object 6.38 - for detaching from the provider. */ 6.39 - 6.40 - provider->attach(); 6.41 - *resource = new DirectoryResource(fileid, provider, this); 6.42 - return L4_EOK; 6.43 -} 6.44 - 6.45 -/* Return a file pager initialised with a provider, page mapper and accessor. */ 6.46 - 6.47 -long FileObjectRegistry::make_file_resource(flags_t flags, fileid_t fileid, 6.48 - offset_t *size, 6.49 - object_flags_t *object_flags, 6.50 - FileProvider *provider, 6.51 - Resource **resource) 6.52 -{ 6.53 - /* Initialise the pager with the provider and a reference to this object for 6.54 - detaching from the provider. */ 6.55 - 6.56 - FilePager *pager = new FilePager(fileid, provider, get_flags(flags), this); 6.57 - 6.58 - /* Obtain the size details from the pager, also providing appropriate 6.59 - flags. */ 6.60 - 6.61 - *size = pager->get_data_size(); 6.62 - *object_flags = OBJECT_SUPPORTS_MMAP | OBJECT_HAS_SIZE; 6.63 - 6.64 - provider->attach(); 6.65 - *resource = pager; 6.66 - return L4_EOK; 6.67 -} 6.68 - 6.69 -/* Make a resource of the appropriate type. */ 6.70 - 6.71 -long FileObjectRegistry::make_resource(flags_t flags, fileid_t fileid, 6.72 - offset_t *size, 6.73 - object_flags_t *object_flags, 6.74 - Provider *provider, Resource **resource) 6.75 -{ 6.76 - DirectoryProvider *dp = dynamic_cast<DirectoryProvider *>(provider); 6.77 - 6.78 - if (dp != NULL) 6.79 - return make_directory_resource(fileid, size, object_flags, dp, resource); 6.80 - 6.81 - FileProvider *fp = dynamic_cast<FileProvider *>(provider); 6.82 - 6.83 - if (fp != NULL) 6.84 - return make_file_resource(flags, fileid, size, object_flags, fp, resource); 6.85 - 6.86 - return -L4_EIO; 6.87 -} 6.88 - 6.89 - 6.90 - 6.91 /* Return a resource for a filesystem object. */ 6.92 6.93 long FileObjectRegistry::get_resource(FileOpening *opening, const char *path, 6.94 @@ -209,7 +143,7 @@ 6.95 6.96 /* Make a resource for the provider. */ 6.97 6.98 - return make_resource(flags, fileid, size, object_flags, provider, resource); 6.99 + return provider->make_resource(size, object_flags, resource); 6.100 } 6.101 6.102
7.1 --- a/libfsserver/lib/files/file_provider.cc Sun Oct 17 18:48:30 2021 +0200 7.2 +++ b/libfsserver/lib/files/file_provider.cc Sun Oct 17 21:55:37 2021 +0200 7.3 @@ -19,14 +19,16 @@ 7.4 * Boston, MA 02110-1301, USA 7.5 */ 7.6 7.7 +#include "file_pager.h" 7.8 #include "file_provider.h" 7.9 7.10 7.11 7.12 /* Initialise the provider with a page 'mapper' for the file's contents. */ 7.13 7.14 -FileProvider::FileProvider(PageMapper *mapper) 7.15 -: Provider(), _mapper(mapper) 7.16 +FileProvider::FileProvider(fileid_t fileid, map_flags_t flags, 7.17 + FileRegistry *registry, PageMapper *mapper) 7.18 +: Provider(fileid, registry), _flags(flags), _mapper(mapper) 7.19 { 7.20 } 7.21 7.22 @@ -50,4 +52,25 @@ 7.23 return _mapper; 7.24 } 7.25 7.26 +/* Return a file pager initialised with a provider, page mapper and accessor. */ 7.27 + 7.28 +long FileProvider::make_resource(offset_t *size, object_flags_t *object_flags, 7.29 + Resource **resource) 7.30 +{ 7.31 + /* Initialise the pager with the provider and a reference to this object for 7.32 + detaching from the provider. */ 7.33 + 7.34 + FilePager *pager = new FilePager(_fileid, this, _flags, _registry); 7.35 + 7.36 + /* Obtain the size details from the pager, also providing appropriate 7.37 + flags. */ 7.38 + 7.39 + *size = pager->get_data_size(); 7.40 + *object_flags = OBJECT_SUPPORTS_MMAP | OBJECT_HAS_SIZE; 7.41 + 7.42 + this->attach(); 7.43 + *resource = pager; 7.44 + return L4_EOK; 7.45 +} 7.46 + 7.47 // vim: tabstop=4 expandtab shiftwidth=4
8.1 --- a/libfsserver/lib/generic/provider.cc Sun Oct 17 18:48:30 2021 +0200 8.2 +++ b/libfsserver/lib/generic/provider.cc Sun Oct 17 21:55:37 2021 +0200 8.3 @@ -23,8 +23,12 @@ 8.4 8.5 8.6 8.7 -Provider::Provider() 8.8 -: NotificationSupport() 8.9 +Provider::Provider(fileid_t fileid, FileRegistry *registry) 8.10 +: NotificationSupport(), _fileid(fileid), _registry(registry) 8.11 +{ 8.12 +} 8.13 + 8.14 +Provider::~Provider() 8.15 { 8.16 } 8.17