# HG changeset patch # User Paul Boddie # Date 1715346544 -7200 # Node ID 7bafcb8b810e05ea17d66805cbd0a1978e8a7bcf # Parent 607879abac84bf793eecd0dad47f9a6d72ef9cf3# Parent bbb065eae48318fbae56af1ca5754ac73499918f Merged changes from the default branch. diff -r 607879abac84 -r 7bafcb8b810e libexec/lib/src/process_creating.cc --- a/libexec/lib/src/process_creating.cc Thu May 09 21:24:58 2024 +0200 +++ b/libexec/lib/src/process_creating.cc Fri May 10 15:09:04 2024 +0200 @@ -327,6 +327,11 @@ l4_cap_idx_t fsserver_cap = _process.allocate_cap(); l4_cap_idx_t fsserver = l4re_env_get_cap(ENV_FILESYSTEM_SERVER_NAME); + /* Obtain the process server capability. */ + + l4_cap_idx_t prserver_cap = _process.allocate_cap(); + l4_cap_idx_t prserver = l4re_env_get_cap(ENV_PROCESS_SERVER_NAME); + /* Also reserve capabilities for the reader and writer. If the reader or writer are invalid capabilities, these will not actually be transferred. */ @@ -337,6 +342,7 @@ struct ipc_mapped_cap program_mapped_caps[] = { {fsserver_cap, fsserver, L4_CAP_FPAGE_RWS, L4_FPAGE_C_OBJ_RIGHTS}, + {prserver_cap, prserver, L4_CAP_FPAGE_RWS, L4_FPAGE_C_OBJ_RIGHTS}, {reader_cap, reader, L4_CAP_FPAGE_RWS, L4_FPAGE_C_OBJ_RIGHTS}, {writer_cap, writer, L4_CAP_FPAGE_RWS, L4_FPAGE_C_OBJ_RIGHTS}, {L4_INVALID_CAP, L4_INVALID_CAP, 0, 0}, @@ -361,6 +367,7 @@ l4re_env_cap_entry_t program_init_caps[] = { l4re_env_cap_entry_t(ENV_FILESYSTEM_SERVER_NAME, fsserver_cap, L4_CAP_FPAGE_RWS), + l4re_env_cap_entry_t(ENV_PROCESS_SERVER_NAME, prserver_cap, L4_CAP_FPAGE_RWS), l4re_env_cap_entry_t(ENV_INPUT_STREAM_NAME, reader_cap, L4_CAP_FPAGE_R), l4re_env_cap_entry_t(ENV_OUTPUT_STREAM_NAME, writer_cap, L4_CAP_FPAGE_W), l4re_env_cap_entry_t() diff -r 607879abac84 -r 7bafcb8b810e libfsclient/include/fsclient/client.h --- a/libfsclient/include/fsclient/client.h Thu May 09 21:24:58 2024 +0200 +++ b/libfsclient/include/fsclient/client.h Fri May 10 15:09:04 2024 +0200 @@ -36,6 +36,7 @@ /* Stream access operations. */ file_t *client_get_stream(const char *name, flags_t flags); +long client_sync_stream(file_t *file); /* Opening and closing operations. */ diff -r 607879abac84 -r 7bafcb8b810e libfsclient/lib/src/client.cc --- a/libfsclient/lib/src/client.cc Thu May 09 21:24:58 2024 +0200 +++ b/libfsclient/lib/src/client.cc Fri May 10 15:09:04 2024 +0200 @@ -140,12 +140,7 @@ else if (position == file->end_pos) { - err = client_next_region(file); - if (err) - return err; - - file->data_current = 0; - return L4_EOK; + return client_next_region(file); } /* Within the current pipe region, synchronise with the pipe object. */ @@ -283,10 +278,10 @@ stream->flags = flags; stream->ref = ref; - /* Test for pipe-based access, switching to memory mapped access if not - supported. */ + /* Synchronise the state of the stream, testing for pipe-based access and + switching to memory mapped access if not supported. */ - long err = client_current_region(stream); + long err = client_sync_stream(stream); if (err == -L4_EBADPROTO) stream->object_flags |= OBJECT_SUPPORTS_MMAP; @@ -310,6 +305,19 @@ return stream; } +/* Initialise the stream data position to the end of any existing data. */ + +long client_sync_stream(file_t *file) +{ + long err = client_current_region(file); + + if (err) + return err; + + file->data_current = file->data_end; + return err; +} + /* Open a filesystem object. */ @@ -608,7 +616,13 @@ if (!client_opened(file)) return -L4_EINVAL; - return pipe_next(file); + long err = pipe_next(file); + + if (err) + return err; + + file->data_current = 0; + return L4_EOK; }