1.1 --- a/libfsserver/lib/files/opener_resource.cc Mon Aug 02 19:39:10 2021 +0200
1.2 +++ b/libfsserver/lib/files/opener_resource.cc Tue Aug 03 00:05:43 2021 +0200
1.3 @@ -48,7 +48,7 @@
1.4
1.5 /* Return a pager object for the given path and flags. */
1.6
1.7 -long OpenerResource::open(const char *path, flags_t flags, Pager **pager)
1.8 +long OpenerResource::open(const char *path, flags_t flags, offset_t *size, l4_cap_idx_t *cap)
1.9 {
1.10 /* Obtain an identifier for the file, even for new files. */
1.11
1.12 @@ -61,9 +61,9 @@
1.13 /* Test for file and directory access. */
1.14
1.15 if (accessing_directory(path, flags, fileid))
1.16 - return get_directory(path, flags, fileid, pager);
1.17 + return get_directory(path, flags, fileid, size, cap);
1.18 else if (accessing_file(path, flags, fileid))
1.19 - return get_file(path, flags, fileid, pager);
1.20 + return get_file(path, flags, fileid, size, cap);
1.21 else
1.22 return -L4_EIO;
1.23 }
1.24 @@ -72,17 +72,36 @@
1.25
1.26 /* Return a directory pager. */
1.27
1.28 -long OpenerResource::get_directory(const char *path, flags_t flags, fileid_t fileid, Pager **pager)
1.29 +long OpenerResource::get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap)
1.30 {
1.31 - (void) path; (void) flags; (void) fileid; *pager = NULL;
1.32 + (void) path; (void) flags; (void) fileid; (void) size; (void) cap;
1.33 return -L4_EIO;
1.34 }
1.35
1.36 /* Return a file pager. */
1.37
1.38 -long OpenerResource::get_file(const char *path, flags_t flags, fileid_t fileid, Pager **pager)
1.39 +long OpenerResource::get_file(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap)
1.40 {
1.41 - return _paging->get_pager(this, path, flags, fileid, pager);
1.42 + Pager *pager;
1.43 + long err = _paging->get_pager(this, path, flags, fileid, &pager);
1.44 +
1.45 + if (err)
1.46 + return err;
1.47 +
1.48 + return resource_for_pager(pager, size, cap);
1.49 +}
1.50 +
1.51 +/* Return pager resource details. */
1.52 +
1.53 +long OpenerResource::resource_for_pager(Pager *pager, offset_t *size, l4_cap_idx_t *cap)
1.54 +{
1.55 + *size = pager->get_data_size();
1.56 +
1.57 + /* Complete the initialisation and start a server in a new thread.
1.58 + If the thread does not start, the resource (including pager) will be
1.59 + finalised. */
1.60 +
1.61 + return ResourceServer(pager).start_thread(cap);
1.62 }
1.63
1.64