paul@10 | 1 | #include "opener_context_resource.h" |
paul@10 | 2 | #include "opener_context_object_server.h" |
paul@10 | 3 | #include "opener_resource.h" |
paul@10 | 4 | #include "resource_server.h" |
paul@9 | 5 | |
paul@32 | 6 | #include <string.h> |
paul@32 | 7 | |
paul@32 | 8 | |
paul@32 | 9 | |
paul@9 | 10 | /* Support for providing access to files. */ |
paul@9 | 11 | |
paul@10 | 12 | OpenerContextResource::OpenerContextResource(OpenerResource *opener, Memory *memory) |
paul@9 | 13 | : SimplePager(memory), _opener(opener) |
paul@9 | 14 | { |
paul@9 | 15 | } |
paul@9 | 16 | |
paul@10 | 17 | int OpenerContextResource::expected_items() |
paul@9 | 18 | { |
paul@10 | 19 | return OpenerContextObject_expected_items; |
paul@9 | 20 | } |
paul@9 | 21 | |
paul@10 | 22 | ipc_server_handler_type OpenerContextResource::handler() |
paul@10 | 23 | { |
paul@10 | 24 | return (ipc_server_handler_type) handle_OpenerContextObject; |
paul@10 | 25 | } |
paul@10 | 26 | |
paul@10 | 27 | |
paul@10 | 28 | |
paul@10 | 29 | /* Data access methods. */ |
paul@10 | 30 | |
paul@10 | 31 | char *OpenerContextResource::get_path() |
paul@9 | 32 | { |
paul@32 | 33 | char *buffer = _region->read(); |
paul@32 | 34 | offset_t size = _region->size(); |
paul@32 | 35 | |
paul@32 | 36 | /* Confine the path to the limit of the buffer. */ |
paul@32 | 37 | |
paul@32 | 38 | if ((buffer != NULL) && (strnlen(buffer, size) < size)) |
paul@32 | 39 | return buffer; |
paul@32 | 40 | else |
paul@32 | 41 | return NULL; |
paul@9 | 42 | } |
paul@9 | 43 | |
paul@10 | 44 | |
paul@10 | 45 | |
paul@10 | 46 | /* Opener context interface methods. */ |
paul@10 | 47 | |
paul@51 | 48 | long OpenerContextResource::open(flags_t flags, size_t *size, l4_cap_idx_t *file) |
paul@10 | 49 | { |
paul@32 | 50 | char *path = get_path(); |
paul@32 | 51 | |
paul@32 | 52 | if (path == NULL) |
paul@32 | 53 | return -L4_EINVAL; |
paul@32 | 54 | |
paul@48 | 55 | FilePager *pager = _opener->open(path, flags); |
paul@10 | 56 | |
paul@62 | 57 | /* Complete the initialisation and start a server in a new thread. |
paul@62 | 58 | If the thread does not start, the resource should be finalised. */ |
paul@10 | 59 | |
paul@10 | 60 | ResourceServer server(pager); |
paul@10 | 61 | long err = server.start_thread(); |
paul@10 | 62 | |
paul@42 | 63 | if (!err) |
paul@42 | 64 | { |
paul@42 | 65 | /* Return the file size. */ |
paul@42 | 66 | /* Return the server capability to the caller. */ |
paul@10 | 67 | |
paul@42 | 68 | *size = pager->get_data_size(); |
paul@42 | 69 | *file = server.config()->server; |
paul@42 | 70 | } |
paul@42 | 71 | |
paul@10 | 72 | return err; |
paul@10 | 73 | } |
paul@10 | 74 | |
paul@9 | 75 | // vim: tabstop=4 expandtab shiftwidth=4 |