1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/files/opener_context_resource.cc Mon Mar 29 00:04:07 2021 +0200
1.3 @@ -0,0 +1,75 @@
1.4 +#include "opener_context_resource.h"
1.5 +#include "opener_context_object_server.h"
1.6 +#include "opener_resource.h"
1.7 +#include "resource_server.h"
1.8 +
1.9 +#include <string.h>
1.10 +
1.11 +
1.12 +
1.13 +/* Support for providing access to files. */
1.14 +
1.15 +OpenerContextResource::OpenerContextResource(OpenerResource *opener, Memory *memory)
1.16 +: SimplePager(memory), _opener(opener)
1.17 +{
1.18 +}
1.19 +
1.20 +int OpenerContextResource::expected_items()
1.21 +{
1.22 + return OpenerContextObject_expected_items;
1.23 +}
1.24 +
1.25 +ipc_server_handler_type OpenerContextResource::handler()
1.26 +{
1.27 + return (ipc_server_handler_type) handle_OpenerContextObject;
1.28 +}
1.29 +
1.30 +
1.31 +
1.32 +/* Data access methods. */
1.33 +
1.34 +char *OpenerContextResource::get_path()
1.35 +{
1.36 + char *buffer = _region->read();
1.37 + offset_t size = _region->size();
1.38 +
1.39 + /* Confine the path to the limit of the buffer. */
1.40 +
1.41 + if ((buffer != NULL) && (strnlen(buffer, size) < size))
1.42 + return buffer;
1.43 + else
1.44 + return NULL;
1.45 +}
1.46 +
1.47 +
1.48 +
1.49 +/* Opener context interface methods. */
1.50 +
1.51 +long OpenerContextResource::open(flags_t flags, size_t *size, l4_cap_idx_t *file)
1.52 +{
1.53 + char *path = get_path();
1.54 +
1.55 + if (path == NULL)
1.56 + return -L4_EINVAL;
1.57 +
1.58 + FilePager *pager = _opener->open(path, flags);
1.59 +
1.60 + /* Complete the initialisation and start a server in a new thread.
1.61 + If the thread does not start, the resource should be finalised. */
1.62 +
1.63 + ResourceServer server(pager);
1.64 + long err = server.start_thread();
1.65 +
1.66 + if (!err)
1.67 + {
1.68 + /* Return the file size. */
1.69 + /* Return the server capability to the caller. */
1.70 +
1.71 + *size = pager->get_data_size();
1.72 + *file = server.config()->server;
1.73 + }
1.74 +
1.75 + return err;
1.76 +}
1.77 +
1.78 +// vim: tabstop=4 expandtab shiftwidth=4