| # zx_stream_readv | 
 |  | 
 | ## NAME | 
 |  | 
 | <!-- Updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | Read data from a stream at the current seek offset. | 
 |  | 
 | ## SYNOPSIS | 
 |  | 
 | <!-- Updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | ```c | 
 | #include <zircon/syscalls.h> | 
 |  | 
 | zx_status_t zx_stream_readv(zx_handle_t handle, | 
 |                             uint32_t options, | 
 |                             zx_iovec_t* vector, | 
 |                             size_t num_vector, | 
 |                             size_t* actual); | 
 | ``` | 
 |  | 
 | ## DESCRIPTION | 
 |  | 
 | `zx_stream_readv()` attempts to read bytes from the stream, starting at the | 
 | current seek offset, into the buffers specified by *vector* and *num_vector*. | 
 | If successful, the number of bytes actually read are return via *actual*. | 
 |  | 
 | If the current seek offset is beyond the end of the stream, `zx_stream_readv()` | 
 | will succeed in reading zero bytes. | 
 |  | 
 | If a NULL *actual* is passed in, it will be ignored. | 
 |  | 
 | Advances the seek offset of the stream by the actual number of bytes read. | 
 | If the read fails, the seek offset could either remain the same or have | 
 | been changed to an unspecified value. | 
 |  | 
 | If the contents of *vector* change during this operation, if any of the buffers | 
 | overlap, or if any of the buffers overlap *vector*, the behavior is unspecified. | 
 |  | 
 | *options* is reserved for future use and must be 0. | 
 |  | 
 | ## RIGHTS | 
 |  | 
 | <!-- Updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | *handle* must be of type **ZX_OBJ_TYPE_STREAM** and have **ZX_RIGHT_READ**. | 
 |  | 
 | ## RETURN VALUE | 
 |  | 
 | `zx_stream_readv()` returns **ZX_OK** on success, and writes into | 
 | *actual* (if non-NULL) the exact number of bytes read. | 
 |  | 
 | ## ERRORS | 
 |  | 
 | **ZX_ERR_BAD_HANDLE**  *handle* is not a valid handle. | 
 |  | 
 | **ZX_ERR_WRONG_TYPE**  *handle* is not a stream handle. | 
 |  | 
 | **ZX_ERR_ACCESS_DENIED**  *handle* does not have the **ZX_RIGHT_READ** right. | 
 |  | 
 | **ZX_ERR_INVALID_ARGS**  *vector* is an invalid `zx_iovec_t` or *options* is | 
 | nonzero. | 
 |  | 
 | **ZX_ERR_NOT_FOUND**  the *vector* address, or an address specified within | 
 | *vector* does not map to address in address space. | 
 |  | 
 | **ZX_ERR_BAD_STATE**  the underlying data source cannot be read. | 
 |  | 
 | ## SEE ALSO | 
 |  | 
 |  - [`zx_stream_create()`] | 
 |  - [`zx_stream_readv_at()`] | 
 |  - [`zx_stream_seek()`] | 
 |  - [`zx_stream_writev()`] | 
 |  - [`zx_stream_writev_at()`] | 
 |  | 
 | <!-- References updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | [`zx_stream_create()`]: stream_create.md | 
 | [`zx_stream_readv_at()`]: stream_readv_at.md | 
 | [`zx_stream_seek()`]: stream_seek.md | 
 | [`zx_stream_writev()`]: stream_writev.md | 
 | [`zx_stream_writev_at()`]: stream_writev_at.md |