# HG changeset patch # User Paul Boddie # Date 1617491962 -7200 # Node ID 13e188dd5a9362939f10a348716c64f902c0b400 # Parent c1d7c64c3ec830720b736993d8eb834587c303f4 Introduced file opening flags to various operations. diff -r c1d7c64c3ec8 -r 13e188dd5a93 client/file.cc --- a/client/file.cc Sat Apr 03 00:02:41 2021 +0200 +++ b/client/file.cc Sun Apr 04 01:19:22 2021 +0200 @@ -53,6 +53,9 @@ long file_context(file_t *file, l4_cap_idx_t server) { + if (l4_is_invalid_cap(server)) + return -L4_EINVAL; + client_Opener opener(server); unsigned long size, flags; long err; @@ -77,11 +80,11 @@ /* Open a file using the given structure and context. */ -long file_context_open(file_t *file, file_t *context) +long file_context_open(file_t *file, flags_t flags, file_t *context) { client_OpenerContext openercontext(context->ref); file_init(file); - return openercontext.open(L4_FPAGE_RW, &file->size, &file->ref); + return openercontext.open(flags, &file->size, &file->ref); } /* Initialise the given file structure. */ @@ -99,7 +102,7 @@ filesystem server. This is a convenience function invoking file_context and file_context_open. */ -long file_open(file_t *file, const char *filename, l4_cap_idx_t server) +long file_open(file_t *file, const char *filename, flags_t flags, l4_cap_idx_t server) { file_t context; long err; @@ -111,7 +114,7 @@ if (!file_string_set(&context, filename, 0, NULL)) return -L4_ENOMEM; - err = file_context_open(file, &context); + err = file_context_open(file, flags, &context); file_close(&context); return err; } @@ -237,6 +240,9 @@ long pipe_open(offset_t size, file_t *reader, file_t *writer, l4_cap_idx_t server) { + if (l4_is_invalid_cap(server)) + return -L4_EINVAL; + client_PipeOpener opener(server); file_init(reader); diff -r c1d7c64c3ec8 -r 13e188dd5a93 client/file.h --- a/client/file.h Sat Apr 03 00:02:41 2021 +0200 +++ b/client/file.h Sun Apr 04 01:19:22 2021 +0200 @@ -55,12 +55,12 @@ /* File operations. */ void file_close(file_t *file); -long file_open(file_t *file, const char *filename, l4_cap_idx_t server); +long file_open(file_t *file, const char *filename, flags_t flags, l4_cap_idx_t server); /* File lifecycle operations. */ long file_context(file_t *file, l4_cap_idx_t server); -long file_context_open(file_t *file, file_t *context); +long file_context_open(file_t *file, flags_t flags, file_t *context); void file_init(file_t *file); /* File and region operations. */ diff -r c1d7c64c3ec8 -r 13e188dd5a93 files/file_paging.cc --- a/files/file_paging.cc Sat Apr 03 00:02:41 2021 +0200 +++ b/files/file_paging.cc Sun Apr 04 01:19:22 2021 +0200 @@ -1,6 +1,8 @@ #include "file_pager.h" #include "file_paging.h" +#include + FilePaging::FilePaging(Pages *pages) @@ -8,6 +10,8 @@ { } + + /* Return any registered page mapper for the given 'fileid' or NULL if no such mapper is registered. */ @@ -34,6 +38,17 @@ _mappers[fileid] = mapper; } + + +/* Convert opening flags to paging flags. */ + +flags_t FilePaging::get_flags(flags_t flags) +{ + return flags & (O_WRONLY | O_RDWR) ? L4_FPAGE_RW : L4_FPAGE_RO; +} + + + /* Obtain a page mapper for the 'fileid' or register a new one in the paging object. */ diff -r c1d7c64c3ec8 -r 13e188dd5a93 files/file_paging.h --- a/files/file_paging.h Sat Apr 03 00:02:41 2021 +0200 +++ b/files/file_paging.h Sun Apr 04 01:19:22 2021 +0200 @@ -36,6 +36,8 @@ virtual fileid_t get_fileid(const char *path) = 0; + virtual flags_t get_flags(flags_t flags); + virtual Accessor *make_accessor(fileid_t fileid) = 0; /* Mapper registry access. */ diff -r c1d7c64c3ec8 -r 13e188dd5a93 files/opener_resource.cc --- a/files/opener_resource.cc Sat Apr 03 00:02:41 2021 +0200 +++ b/files/opener_resource.cc Sun Apr 04 01:19:22 2021 +0200 @@ -30,7 +30,7 @@ if (fileid == FILEID_INVALID) return NULL; - return get_pager(fileid, flags); + return get_pager(fileid, get_flags(flags)); } diff -r c1d7c64c3ec8 -r 13e188dd5a93 tests/dstest_block_client.cc --- a/tests/dstest_block_client.cc Sat Apr 03 00:02:41 2021 +0200 +++ b/tests/dstest_block_client.cc Sun Apr 04 01:19:22 2021 +0200 @@ -22,6 +22,8 @@ #include #include +#include + #include #include #include @@ -70,7 +72,7 @@ /* Invoke the open method to receive the file reference. */ file_t file; - long err = file_open(&file, filename, server); + long err = file_open(&file, filename, O_RDWR, server); if (err) { diff -r c1d7c64c3ec8 -r 13e188dd5a93 tests/dstest_host_client.cc --- a/tests/dstest_host_client.cc Sat Apr 03 00:02:41 2021 +0200 +++ b/tests/dstest_host_client.cc Sun Apr 04 01:19:22 2021 +0200 @@ -22,6 +22,8 @@ #include #include +#include + #include #include #include @@ -56,7 +58,7 @@ /* Invoke the open method to receive the file reference. */ file_t file; - long err = file_open(&file, filename, server); + long err = file_open(&file, filename, O_RDWR, server); if (err) { diff -r c1d7c64c3ec8 -r 13e188dd5a93 tests/dstest_test_client.cc --- a/tests/dstest_test_client.cc Sat Apr 03 00:02:41 2021 +0200 +++ b/tests/dstest_test_client.cc Sun Apr 04 01:19:22 2021 +0200 @@ -22,6 +22,8 @@ #include #include +#include + #include #include #include @@ -65,7 +67,7 @@ file_t file; - long err = file_context_open(&file, context); + long err = file_context_open(&file, O_RDONLY, context); if (err) {