blob: 3eaa6163a4be15a3eba0927e12b4ae3c73beb621 [file] [log] [blame] [view]
# zx_channel_write
<!-- Updated by update-docs-from-fidl, do not edit. -->
Write a message to a channel.
<!-- Updated by update-docs-from-fidl, do not edit. -->
#include <zircon/syscalls.h>
zx_status_t zx_channel_write(zx_handle_t handle,
uint32_t options,
const void* bytes,
uint32_t num_bytes,
const zx_handle_t* handles,
uint32_t num_handles);
`zx_channel_write()` attempts to write a message of *num_bytes*
bytes and *num_handles* handles to the channel specified by
*handle*. The pointers *handles* and *bytes* may be NULL if their
respective sizes are zero.
On success, all *num_handles* of the handles in the *handles* array
are attached to the message and will become available to the reader
of that message from the opposite end of the channel.
All handles are discarded and no longer available to the caller, on
success or failure. Use [`zx_channel_write_etc()`] if handles need
to be preserved by the sender.
It is invalid to include *handle* (the handle of the channel being written
to) in the *handles* array (the handles being sent in the message).
The maximum number of handles which may be sent in a message is
**ZX_CHANNEL_MAX_MSG_HANDLES**, which is 64.
The maximum number of bytes which may be sent in a message is
**ZX_CHANNEL_MAX_MSG_BYTES**, which is 65536.
Messages are drained by [`zx_channel_read()`] or [`zx_channel_read_etc()`].
Failure to drain the messages in a timely fashion can cause excessive kernel
memory to be used which might generate an exception. See
[ipc limits](/docs/concepts/kernel/ for details.
<!-- Updated by update-docs-from-fidl, do not edit. -->
*handle* must be of type **ZX_OBJ_TYPE_CHANNEL** and have **ZX_RIGHT_WRITE**.
Every entry of *handles* must have **ZX_RIGHT_TRANSFER**.
`zx_channel_write()` returns **ZX_OK** on success.
**ZX_ERR_BAD_HANDLE** *handle* is not a valid handle, any element in
*handles* is not a valid handle, or there are repeated handles among the
handles in the *handles* array.
**ZX_ERR_WRONG_TYPE** *handle* is not a channel handle.
**ZX_ERR_INVALID_ARGS** *bytes* is an invalid pointer, *handles*
is an invalid pointer, or *options* is nonzero.
**ZX_ERR_NOT_SUPPORTED** *handle* was found in the *handles* array, or
one of the handles in *handles* was *handle* (the handle to the
channel being written to).
**ZX_ERR_ACCESS_DENIED** *handle* does not have **ZX_RIGHT_WRITE** or
any element in *handles* does not have **ZX_RIGHT_TRANSFER**.
**ZX_ERR_PEER_CLOSED** The other side of the channel is closed.
**ZX_ERR_NO_MEMORY** Failure due to lack of memory.
There is no good way for userspace to handle this (unlikely) error.
In a future build this error will no longer occur.
**ZX_ERR_OUT_OF_RANGE** *num_bytes* or *num_handles* are larger than the
largest allowable size for channel messages.
*num_handles* is a count of the number of elements in the *handles*
array, not its size in bytes.
The byte size limitation on messages is not yet finalized.
- [`zx_channel_call()`]
- [`zx_channel_create()`]
- [`zx_channel_read()`]
- [`zx_channel_read_etc()`]
- [`zx_channel_write_etc()`]
- [`zx_handle_close()`]
- [`zx_handle_duplicate()`]
- [`zx_handle_replace()`]
- [`zx_object_wait_async()`]
- [`zx_object_wait_many()`]
- [`zx_object_wait_one()`]
<!-- References updated by update-docs-from-fidl, do not edit. -->