1.1 --- a/libfsclient/lib/src/file.cc Sat May 14 23:52:24 2022 +0200
1.2 +++ b/libfsclient/lib/src/file.cc Thu May 19 14:08:28 2022 +0200
1.3 @@ -21,8 +21,10 @@
1.4
1.5 #include <ipc/cap_alloc.h>
1.6 #include <ipc/mem_ipc.h>
1.7 +#include <systypes/fcntl.h>
1.8 #include <systypes/stat.h>
1.9
1.10 +#include <stdio.h>
1.11 #include <string.h>
1.12
1.13 #include "dataspace_client.h"
1.14 @@ -88,6 +90,7 @@
1.15 file->object_flags = 0;
1.16 file->can_block = 0;
1.17 file->notifications = 0;
1.18 + file->flags = 0;
1.19 }
1.20
1.21
1.22 @@ -255,6 +258,7 @@
1.23 long err;
1.24
1.25 file_init(file);
1.26 + file->flags = O_RDWR;
1.27
1.28 err = opener.context(&file->ref);
1.29 if (err)
1.30 @@ -286,6 +290,7 @@
1.31 {
1.32 client_OpenerContext openercontext(context->ref);
1.33 file_init(file);
1.34 + file->flags = flags;
1.35 return openercontext.open(flags, &file->size, &file->ref, &file->object_flags);
1.36 }
1.37
1.38 @@ -346,7 +351,8 @@
1.39 /* Map a region of the given file to a memory region, obtaining an updated file
1.40 size and populated data details. Unmap any previously mapped region. */
1.41
1.42 -long file_mmap(file_t *file, offset_t position, offset_t length)
1.43 +long file_mmap(file_t *file, offset_t position, offset_t length,
1.44 + l4re_rm_flags_t region_flags)
1.45 {
1.46 char *memory = file->memory;
1.47 client_MappedFile mapped_file(file->ref);
1.48 @@ -358,7 +364,10 @@
1.49
1.50 _update_extent(file);
1.51
1.52 - err = ipc_attach_dataspace(file->ref, file_span(file), (void **) &file->memory);
1.53 + err = ipc_attach_dataspace_align(file->ref, file_span(file),
1.54 + L4RE_RM_F_SEARCH_ADDR | region_flags,
1.55 + L4_PAGESHIFT,
1.56 + (void **) &file->memory);
1.57 if (err)
1.58 return err;
1.59
1.60 @@ -368,6 +377,30 @@
1.61 return L4_EOK;
1.62 }
1.63
1.64 +/* Return mmap flags corresponding to the file access flags. */
1.65 +
1.66 +l4re_rm_flags_t file_region_flags(flags_t flags)
1.67 +{
1.68 + l4re_rm_flags_t rm_flags;
1.69 +
1.70 + switch (flags & 3)
1.71 + {
1.72 + case O_WRONLY:
1.73 + rm_flags = L4RE_RM_F_W;
1.74 + break;
1.75 +
1.76 + case O_RDWR:
1.77 + rm_flags = L4RE_RM_F_RW;
1.78 + break;
1.79 +
1.80 + default:
1.81 + rm_flags = L4RE_RM_F_R;
1.82 + break;
1.83 + }
1.84 +
1.85 + return rm_flags;
1.86 +}
1.87 +
1.88 /* Resize a file, obtaining updated file size and populated data details. */
1.89
1.90 long file_resize(file_t *file, offset_t size)
1.91 @@ -624,6 +657,8 @@
1.92
1.93 file_init(reader);
1.94 file_init(writer);
1.95 + reader->flags = O_RDONLY;
1.96 + writer->flags = O_WRONLY;
1.97
1.98 return opener.pipe(size, &reader->ref, &writer->ref);
1.99 }
1.100 @@ -697,6 +732,7 @@
1.101 {
1.102 client_Directory directory(file->ref);
1.103 file_init(reader);
1.104 + reader->flags = O_RDONLY;
1.105 return directory.opendir(&reader->size, &reader->ref, &reader->object_flags);
1.106 }
1.107