blob: bb4b8754f8bea36757bf5f06cf502d524fd4f758 [file] [log] [blame] [view]
<!--
Copyright 2023 The Fuchsia Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
DO NOT EDIT. Generated from FIDL library zx by zither, a Fuchsia platform tool.
See //docs/reference/syscalls/README.md#documentation-generation for
regeneration instructions.
-->
# zx_socket_read
## Summary
Read data from a socket.
## Declaration
```c
#include <zircon/syscalls.h>
zx_status_t zx_socket_read(zx_handle_t handle,
uint32_t options,
void* buffer,
size_t buffer_size,
size_t* actual);
```
## Description
`zx_socket_read()` attempts to read *buffer_size* bytes into *buffer*. If
successful, the number of bytes actually read are return via
*actual*.
If a NULL *actual* is passed in, it will be ignored.
If the socket was created with `ZX_SOCKET_DATAGRAM`, this syscall reads
only the first available datagram in the socket (if one is present).
If *buffer* is too small for the datagram, then the read will be
truncated, and any remaining bytes in the datagram will be discarded.
Supported *options* are:
* `ZX_SOCKET_PEEK` to leave the message in the socket.
To determine how many bytes are available to read, use the `rx_buf_available`
field of the resulting `zx_info_socket_t`, which you can obtain using the
`ZX_INFO_SOCKET` topic for [`zx_object_get_info()`].
## Rights
*handle* must be of type `ZX_OBJ_TYPE_SOCKET` and have `ZX_RIGHT_READ`.
## Return value
`zx_socket_read()` 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_BAD_STATE` writing to *handle*'s peer has been disabled via
[`zx_socket_set_disposition()`] and no pending data remains on *handle*.
`ZX_ERR_WRONG_TYPE` *handle* is not a socket handle.
`ZX_ERR_INVALID_ARGS` If any of *buffer* or *actual* are non-NULL
but invalid pointers, or if *buffer* is NULL, or if *options* is zero.
`ZX_ERR_ACCESS_DENIED` *handle* does not have `ZX_RIGHT_READ`.
`ZX_ERR_SHOULD_WAIT` The socket contained no data to read.
`ZX_ERR_PEER_CLOSED` The other side of the socket is closed and no data is
readable.
## See also
- [`zx_socket_create()`]
- [`zx_socket_set_disposition()`]
- [`zx_socket_write()`]
[`zx_object_get_info()`]: object_get_info.md
[`zx_socket_create()`]: socket_create.md
[`zx_socket_set_disposition()`]: socket_set_disposition.md
[`zx_socket_write()`]: socket_write.md