blob: 7b72565eeaa0bb820b0ec91120ba35d35cbd2a74 [file] [log] [blame] [view]
# zx_socket_write
## NAME
socket_write - write data to a socket
## SYNOPSIS
```
#include <zircon/syscalls.h>
zx_status_t zx_socket_write(zx_handle_t handle, uint32_t options,
const void* buffer, size_t size,
size_t* actual) {
```
## DESCRIPTION
**socket_write**() attempts to write *size* bytes to the socket
specified by *handle*. The pointer to *bytes* may be NULL if *size*
is zero.
If *size* is zero, a bitwise combination of **ZX_SOCKET_SHUTDOWN_READ** and
**ZX_SOCKET_SHUTDOWN_WRITE** can be passed to *options* to disable reading or
writing from a socket endpoint.
If **ZX_SOCKET_SHUTDOWN_READ** is passed to *options*, and *size* is 0, then reading is disabled for
the socket endpoint at *handle*. All data buffered in the socket at the time of the call may be
read, but further reads from this endpoint or writes to the other endpoint of the socket will fail
with **ZX_ERR_BAD_STATE**.
If **ZX_SOCKET_SHUTDOWN_WRITE** is passed to *options*, and *size* is 0, then writing is disabled for
the socket endpoint at *handle*. Further writes to this endpoint or reads from the other endpoint of
the socket will fail with **ZX_ERR_BAD_STATE**.
If **ZX_SOCKET_CONTROL** is passed to *options*, then **socket_write**() attempts to write
into the socket control plane. A write to the control plane is never short. If the socket
control plane has insufficient space for *buffer*, it writes nothing and returns
**ZX_ERR_OUT_OF_RANGE**.
If a NULL *actual* is passed in, it will be ignored.
A **ZX_SOCKET_STREAM** socket write can be short if the socket does not
have enough space for all of *buffer*. The amount written is returned
via *actual*.
A **ZX_SOCKET_DATAGRAM** socket write is never short. If the socket has
insufficient space for *buffer*, it writes nothing and returns
**ZX_ERR_SHOULD_WAIT**.
## RETURN VALUE
**socket_write**() returns **ZX_OK** on success.
## ERRORS
**ZX_ERR_BAD_HANDLE** *handle* is not a valid handle.
**ZX_ERR_BAD_STATE** *options* includes **ZX_SOCKET_CONTROL** and the
socket was not created with **ZX_SOCKET_HAS_CONTROL**.
**ZX_ERR_WRONG_TYPE** *handle* is not a socket handle.
**ZX_ERR_INVALID_ARGS** *buffer* is an invalid pointer, or
**ZX_SOCKET_HALF_CLOSE** was passed to *options* but *size* was
not 0, or *options* was not 0 or **ZX_SOCKET_HALF_CLOSE**.
**ZX_ERR_ACCESS_DENIED** *handle* does not have **ZX_RIGHT_WRITE**.
**ZX_ERR_SHOULD_WAIT** The buffer underlying the socket is full, or
the socket was created with **ZX_SOCKET_DATAGRAM** and *buffer* is
larger than the remaining space in the socket.
**ZX_ERR_BAD_STATE** Writing has been disabled for this socket endpoint.
**ZX_ERR_PEER_CLOSED** The other side of the socket is closed.
**ZX_ERR_NO_MEMORY** (Temporary) Failure due to lack of memory.
## SEE ALSO
[socket_create](socket_create.md),
[socket_read](socket_read.md).