1.1 --- a/dstest_test_client.cc Sun Feb 28 23:28:45 2021 +0100
1.2 +++ b/dstest_test_client.cc Mon Mar 01 00:22:56 2021 +0100
1.3 @@ -138,7 +138,7 @@
1.4
1.5 static long context_for_file(unsigned long fileid, file_t *file, l4_cap_idx_t server)
1.6 {
1.7 - long err = context_open(file, server);
1.8 + long err = file_context(file, server);
1.9
1.10 if (err)
1.11 {
2.1 --- a/file.cc Sun Feb 28 23:28:45 2021 +0100
2.2 +++ b/file.cc Mon Mar 01 00:22:56 2021 +0100
2.3 @@ -31,25 +31,7 @@
2.4
2.5
2.6
2.7 -offset_t file_span(file_t *file)
2.8 -{
2.9 - offset_t size = file->end_pos - file->start_pos;
2.10 -
2.11 - return (file->data_end < size) ? file->data_end : size;
2.12 -}
2.13 -
2.14 -void file_init(file_t *file)
2.15 -{
2.16 - file->memory = NULL;
2.17 - file->ref = L4_INVALID_CAP;
2.18 -}
2.19 -
2.20 -long file_open(file_t *file, l4_cap_idx_t context_ref)
2.21 -{
2.22 - client_OpenerContext context(context_ref);
2.23 - file_init(file);
2.24 - return context.open(L4_FPAGE_RW, &file->size, &file->ref);
2.25 -}
2.26 +/* Release resources for the given file. */
2.27
2.28 void file_close(file_t *file)
2.29 {
2.30 @@ -62,18 +44,9 @@
2.31 file_init(file);
2.32 }
2.33
2.34 -long file_mmap(file_t *file, offset_t position, offset_t length)
2.35 -{
2.36 - client_MappedFile mapped_file(file->ref);
2.37 - long err = mapped_file.mmap(position, length, &file->start_pos, &file->end_pos, &file->data_end);
2.38 +/* Initialise a file structure for a context obtained from the given server. */
2.39
2.40 - if (err)
2.41 - return err;
2.42 -
2.43 - return ipc_attach_dataspace(file->ref, file->end_pos - file->start_pos, (void **) &file->memory);
2.44 -}
2.45 -
2.46 -long context_open(file_t *file, l4_cap_idx_t server)
2.47 +long file_context(file_t *file, l4_cap_idx_t server)
2.48 {
2.49 client_Opener opener(server);
2.50 unsigned long size, flags;
2.51 @@ -95,4 +68,43 @@
2.52 return ipc_attach_dataspace(file->ref, size, (void **) &file->memory);
2.53 }
2.54
2.55 +/* Initialise the given file structure. */
2.56 +
2.57 +void file_init(file_t *file)
2.58 +{
2.59 + file->memory = NULL;
2.60 + file->ref = L4_INVALID_CAP;
2.61 +}
2.62 +
2.63 +/* Map a region of the given file to a memory region. */
2.64 +
2.65 +long file_mmap(file_t *file, offset_t position, offset_t length)
2.66 +{
2.67 + client_MappedFile mapped_file(file->ref);
2.68 + long err = mapped_file.mmap(position, length, &file->start_pos, &file->end_pos, &file->data_end);
2.69 +
2.70 + if (err)
2.71 + return err;
2.72 +
2.73 + return ipc_attach_dataspace(file->ref, file->end_pos - file->start_pos, (void **) &file->memory);
2.74 +}
2.75 +
2.76 +/* Open a file using the given structure and context reference. */
2.77 +
2.78 +long file_open(file_t *file, l4_cap_idx_t context_ref)
2.79 +{
2.80 + client_OpenerContext context(context_ref);
2.81 + file_init(file);
2.82 + return context.open(L4_FPAGE_RW, &file->size, &file->ref);
2.83 +}
2.84 +
2.85 +/* Return the amount of data in the mapped region for the given file. */
2.86 +
2.87 +offset_t file_span(file_t *file)
2.88 +{
2.89 + offset_t size = file->end_pos - file->start_pos;
2.90 +
2.91 + return (file->data_end < size) ? file->data_end : size;
2.92 +}
2.93 +
2.94 // vim: tabstop=2 expandtab shiftwidth=2
3.1 --- a/file.h Sun Feb 28 23:28:45 2021 +0100
3.2 +++ b/file.h Mon Mar 01 00:22:56 2021 +0100
3.3 @@ -25,18 +25,37 @@
3.4
3.5
3.6
3.7 +EXTERN_C_BEGIN
3.8 +
3.9 +/* File access abstraction. */
3.10 +
3.11 typedef struct
3.12 {
3.13 + /* File object reference. */
3.14 +
3.15 l4_cap_idx_t ref;
3.16 +
3.17 + /* Mapped memory accessing a file region. */
3.18 +
3.19 char *memory;
3.20 - offset_t start_pos, end_pos, data_end, size;
3.21 +
3.22 + /* File region parameters. */
3.23 +
3.24 + offset_t start_pos, end_pos; /* start and end of region */
3.25 + offset_t data_end; /* amount of data in the region */
3.26 + offset_t size; /* total size of file */
3.27 +
3.28 } file_t;
3.29
3.30 -offset_t file_span(file_t *file);
3.31 +/* File access operations. */
3.32 +
3.33 +void file_close(file_t *file);
3.34 +long file_context(file_t *file, l4_cap_idx_t server);
3.35 void file_init(file_t *file);
3.36 +long file_mmap(file_t *file, offset_t position, offset_t length);
3.37 long file_open(file_t *file, l4_cap_idx_t context_ref);
3.38 -void file_close(file_t *file);
3.39 -long file_mmap(file_t *file, offset_t position, offset_t length);
3.40 -long context_open(file_t *file, l4_cap_idx_t server);
3.41 +offset_t file_span(file_t *file);
3.42 +
3.43 +EXTERN_C_END
3.44
3.45 // vim: tabstop=2 expandtab shiftwidth=2