zx_channel_read - zx_channel_read_etc


channel_read - read a message from a channel


#include <zircon/syscalls.h>

zx_status_t zx_channel_read(zx_handle_t handle, uint32_t options,
                            void* bytes, zx_handle_t* handles,
                            uint32_t num_bytes, uint32_t num_handles,
                            uint32_t* actual_bytes, uint32_t* actual_handles);

zx_status_t zx_channel_read_etc(zx_handle_t handle, uint32_t options,
                                void* bytes, zx_handle_info_t* handles,
                                uint32_t num_bytes, uint32_t num_handles,
                                uint32_t* actual_bytes, uint32_t* actual_handles);


channel_read() and channel_read_etc() attempts to read the first message from the channel specified by handle into the provided bytes and/or handles buffers.

The parameters num_bytes and num_handles are used to specify the size of the respective read buffers.

Channel messages may contain both byte data and handle payloads and may only be read in their entirety. Partial reads are not possible.

The bytes buffer is written before the handles buffer. In the event of overlap between these two buffers, the contents written to handles will overwrite the portion of bytes it overlaps.

Both forms of read behave the same except that channel_read() returns an array of raw zx_handle_t handle values while channel_read_etc() returns an array of zx_handle_info_t structures of the form:

typedef struct {
    zx_handle_t handle;     // handle value
    zx_obj_type_t type;     // type of object, see ZX_OBJ_TYPE_
    zx_rights_t rights;     // handle rights
    uint32_t unused;        // set to zero
} zx_handle_info_t;

When communicating to an untrusted party over a channel, it is recommended that the channel_read_etc() form is used and each handle type and rights are validated against the expected values.


handle must have ZX_RIGHT_READ.


Both forms of read returns ZX_OK on success, if actual_bytes and actual_handles (if non-NULL), contain the exact number of bytes and count of handles read.


ZX_ERR_BAD_HANDLE handle is not a valid handle.

ZX_ERR_WRONG_TYPE handle is not a channel handle.

ZX_ERR_INVALID_ARGS If any of bytes, handles, actual_bytes, or actual_handles are non-NULL and an invalid pointer.

ZX_ERR_ACCESS_DENIED handle does not have ZX_RIGHT_READ.

ZX_ERR_SHOULD_WAIT The channel contained no messages to read.

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_BUFFER_TOO_SMALL The provided bytes or handles buffers are too small (in which case, the minimum sizes necessary to receive the message will be written to actual_bytes and actual_handles, provided they are non-NULL). If options has ZX_CHANNEL_READ_MAY_DISCARD set, then the message is discarded.


num_handles and actual_handles are counts of the number of elements in the handles array, not its size in bytes.


handle_close, handle_duplicate, handle_replace, object_wait_one, object_wait_many, channel_call, channel_create, channel_write.