1.1 --- a/file.cc Wed Mar 24 23:18:06 2021 +0100
1.2 +++ b/file.cc Wed Mar 24 23:44:53 2021 +0100
1.3 @@ -28,6 +28,8 @@
1.4 #include "file_client.h"
1.5 #include "opener_client.h"
1.6 #include "opener_context_client.h"
1.7 +#include "pipe_client.h"
1.8 +#include "pipe_opener_client.h"
1.9 #include "mapped_file_client.h"
1.10
1.11 #include "file.h"
1.12 @@ -229,4 +231,90 @@
1.13 return 0;
1.14 }
1.15
1.16 +
1.17 +
1.18 +/* Open two pipe endpoints using the given pipe server. */
1.19 +
1.20 +long pipe_open(file_t *reader, file_t *writer, l4_cap_idx_t server)
1.21 +{
1.22 + client_PipeOpener opener(server);
1.23 +
1.24 + file_init(reader);
1.25 + file_init(writer);
1.26 +
1.27 + long err = opener.pipe(&reader->ref, &writer->ref);
1.28 + if (err)
1.29 + return err;
1.30 +
1.31 + err = pipe_next(writer) || pipe_next(reader);
1.32 +
1.33 + if (err)
1.34 + {
1.35 + file_close(reader);
1.36 + file_close(writer);
1.37 + }
1.38 +
1.39 + return err;
1.40 +}
1.41 +
1.42 +/* Access the current region for a pipe endpoint. */
1.43 +
1.44 +long pipe_current(file_t *pipe)
1.45 +{
1.46 + client_Pipe _pipe(pipe->ref);
1.47 + long err = _pipe.current_region(&pipe->data_end, &pipe->size);
1.48 + char *memory = pipe->memory;
1.49 +
1.50 + if (err)
1.51 + return err;
1.52 +
1.53 + pipe->end_pos = pipe->size;
1.54 +
1.55 + err = ipc_attach_dataspace(pipe->ref, file_span(pipe), (void **) &pipe->memory);
1.56 + if (err)
1.57 + return err;
1.58 +
1.59 + if (memory != NULL)
1.60 + ipc_detach_dataspace(memory);
1.61 +
1.62 + return L4_EOK;
1.63 +}
1.64 +
1.65 +/* Access the next region for a pipe endpoint, updating the eventual size of
1.66 + the current region. */
1.67 +
1.68 +long pipe_next(file_t *pipe)
1.69 +{
1.70 + client_Pipe _pipe(pipe->ref);
1.71 + long err = _pipe.next_region(&pipe->data_end, &pipe->size);
1.72 + char *memory = pipe->memory;
1.73 +
1.74 + if (err)
1.75 + return err;
1.76 +
1.77 + pipe->end_pos = pipe->size;
1.78 +
1.79 + err = ipc_attach_dataspace(pipe->ref, file_span(pipe), (void **) &pipe->memory);
1.80 + if (err)
1.81 + return err;
1.82 +
1.83 + if (memory != NULL)
1.84 + ipc_detach_dataspace(memory);
1.85 +
1.86 + return L4_EOK;
1.87 +}
1.88 +
1.89 +/* Set the size of the written region. */
1.90 +
1.91 +long pipe_written(file_t *pipe, offset_t size)
1.92 +{
1.93 + if (size <= pipe->size)
1.94 + {
1.95 + pipe->data_end = size;
1.96 + return L4_EOK;
1.97 + }
1.98 + else
1.99 + return -L4_EINVAL;
1.100 +}
1.101 +
1.102 // vim: tabstop=2 expandtab shiftwidth=2