| // Copyright 2018 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. |
| |
| #include <lib/zxio/inception.h> |
| #include <lib/zxio/null.h> |
| #include <lib/zxio/ops.h> |
| #include <zircon/syscalls.h> |
| |
| static zx_status_t zxio_socket_close(zxio_t* io) { |
| zxio_socket_t* zs = reinterpret_cast<zxio_socket_t*>(io); |
| return zxs_close(&zs->socket); |
| } |
| |
| static zx_status_t zxio_socket_release(zxio_t* io, zx_handle_t* out_handle) { |
| zxio_socket_t* zs = reinterpret_cast<zxio_socket_t*>(io); |
| zx_handle_t socket = zs->socket.socket; |
| zs->socket.socket = ZX_HANDLE_INVALID; |
| *out_handle = socket; |
| return ZX_OK; |
| } |
| |
| static zx_status_t zxio_socket_clone(zxio_t* io, zx_handle_t* out_handle) { |
| zxio_socket_t* zs = reinterpret_cast<zxio_socket_t*>(io); |
| return zx_handle_duplicate(zs->socket.socket, ZX_RIGHT_SAME_RIGHTS, |
| out_handle); |
| } |
| |
| static zx_status_t zxio_socket_read(zxio_t* io, void* buffer, size_t capacity, |
| size_t* out_actual) { |
| zxio_socket_t* zs = reinterpret_cast<zxio_socket_t*>(io); |
| return zxs_recv(&zs->socket, buffer, capacity, out_actual); |
| } |
| |
| static zx_status_t zxio_socket_write(zxio_t* io, const void* buffer, |
| size_t capacity, size_t* out_actual) { |
| zxio_socket_t* zs = reinterpret_cast<zxio_socket_t*>(io); |
| return zxs_send(&zs->socket, buffer, capacity, out_actual); |
| } |
| |
| static constexpr zxio_ops_t zxio_socket_ops = []() { |
| zxio_ops_t ops = zxio_default_ops; |
| ops.close = zxio_socket_close; |
| ops.release = zxio_socket_release; |
| ops.clone = zxio_socket_clone; |
| ops.read = zxio_socket_read; |
| ops.write = zxio_socket_write; |
| return ops; |
| }(); |
| |
| zx_status_t zxio_socket_init(zxio_storage_t* storage, zxs_socket_t socket) { |
| zxio_socket_t* zs = reinterpret_cast<zxio_socket_t*>(storage); |
| zxio_init(&zs->io, &zxio_socket_ops); |
| zs->socket = socket; |
| return ZX_OK; |
| } |