1.1 --- a/libfsserver/include/fsserver/opener_resource.h Mon Aug 02 19:39:10 2021 +0200
1.2 +++ b/libfsserver/include/fsserver/opener_resource.h Tue Aug 03 00:05:43 2021 +0200
1.3 @@ -44,9 +44,13 @@
1.4
1.5 /* Convenience methods obtaining different pager types. */
1.6
1.7 - virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, Pager **pager);
1.8 + virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap);
1.9 +
1.10 + virtual long get_file(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap);
1.11
1.12 - virtual long get_file(const char *path, flags_t flags, fileid_t fileid, Pager **pager);
1.13 + /* Preparation of resources for pagers. */
1.14 +
1.15 + long resource_for_pager(Pager *pager, offset_t *size, l4_cap_idx_t *cap);
1.16
1.17 public:
1.18 explicit OpenerResource(FilePaging *paging);
1.19 @@ -64,7 +68,7 @@
1.20
1.21 /* Direct access methods. */
1.22
1.23 - long open(const char *path, flags_t flags, Pager **pager);
1.24 + long open(const char *path, flags_t flags, offset_t *size, l4_cap_idx_t *cap);
1.25
1.26 /* Opener interface methods. */
1.27
2.1 --- a/libfsserver/lib/files/opener_context_resource.cc Mon Aug 02 19:39:10 2021 +0200
2.2 +++ b/libfsserver/lib/files/opener_context_resource.cc Tue Aug 03 00:05:43 2021 +0200
2.3 @@ -22,7 +22,6 @@
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 @@ -73,19 +72,7 @@
2.12 if (path == NULL)
2.13 return -L4_EINVAL;
2.14
2.15 - Pager *pager;
2.16 - long err = _opener->open(path, flags, &pager);
2.17 -
2.18 - if (err)
2.19 - return err;
2.20 -
2.21 - *size = pager->get_data_size();
2.22 -
2.23 - /* Complete the initialisation and start a server in a new thread.
2.24 - If the thread does not start, the resource (including pager) will be
2.25 - finalised. */
2.26 -
2.27 - return ResourceServer(pager).start_thread(file);
2.28 + return _opener->open(path, flags, size, file);
2.29 }
2.30
2.31 // vim: tabstop=4 expandtab shiftwidth=4
3.1 --- a/libfsserver/lib/files/opener_resource.cc Mon Aug 02 19:39:10 2021 +0200
3.2 +++ b/libfsserver/lib/files/opener_resource.cc Tue Aug 03 00:05:43 2021 +0200
3.3 @@ -48,7 +48,7 @@
3.4
3.5 /* Return a pager object for the given path and flags. */
3.6
3.7 -long OpenerResource::open(const char *path, flags_t flags, Pager **pager)
3.8 +long OpenerResource::open(const char *path, flags_t flags, offset_t *size, l4_cap_idx_t *cap)
3.9 {
3.10 /* Obtain an identifier for the file, even for new files. */
3.11
3.12 @@ -61,9 +61,9 @@
3.13 /* Test for file and directory access. */
3.14
3.15 if (accessing_directory(path, flags, fileid))
3.16 - return get_directory(path, flags, fileid, pager);
3.17 + return get_directory(path, flags, fileid, size, cap);
3.18 else if (accessing_file(path, flags, fileid))
3.19 - return get_file(path, flags, fileid, pager);
3.20 + return get_file(path, flags, fileid, size, cap);
3.21 else
3.22 return -L4_EIO;
3.23 }
3.24 @@ -72,17 +72,36 @@
3.25
3.26 /* Return a directory pager. */
3.27
3.28 -long OpenerResource::get_directory(const char *path, flags_t flags, fileid_t fileid, Pager **pager)
3.29 +long OpenerResource::get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap)
3.30 {
3.31 - (void) path; (void) flags; (void) fileid; *pager = NULL;
3.32 + (void) path; (void) flags; (void) fileid; (void) size; (void) cap;
3.33 return -L4_EIO;
3.34 }
3.35
3.36 /* Return a file pager. */
3.37
3.38 -long OpenerResource::get_file(const char *path, flags_t flags, fileid_t fileid, Pager **pager)
3.39 +long OpenerResource::get_file(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap)
3.40 {
3.41 - return _paging->get_pager(this, path, flags, fileid, pager);
3.42 + Pager *pager;
3.43 + long err = _paging->get_pager(this, path, flags, fileid, &pager);
3.44 +
3.45 + if (err)
3.46 + return err;
3.47 +
3.48 + return resource_for_pager(pager, size, cap);
3.49 +}
3.50 +
3.51 +/* Return pager resource details. */
3.52 +
3.53 +long OpenerResource::resource_for_pager(Pager *pager, offset_t *size, l4_cap_idx_t *cap)
3.54 +{
3.55 + *size = pager->get_data_size();
3.56 +
3.57 + /* Complete the initialisation and start a server in a new thread.
3.58 + If the thread does not start, the resource (including pager) will be
3.59 + finalised. */
3.60 +
3.61 + return ResourceServer(pager).start_thread(cap);
3.62 }
3.63
3.64