1// Copyright 2016 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <stdarg.h>
6#include <stdatomic.h>
7#include <stdint.h>
8#include <stdlib.h>
9#include <string.h>
10
11#include <zircon/syscalls.h>
12#include <zircon/types.h>
13#include <lib/fdio/io.h>
14
15#include "private.h"
16
17zx_status_t fdio_default_get_token(fdio_t* io, zx_handle_t* out) {
18    return ZX_ERR_NOT_SUPPORTED;
19}
20
21zx_status_t fdio_default_get_attr(fdio_t* io, vnattr_t* out) {
22    return ZX_ERR_NOT_SUPPORTED;
23}
24
25zx_status_t fdio_default_set_attr(fdio_t* io, const vnattr_t* attr) {
26    return ZX_ERR_NOT_SUPPORTED;
27}
28
29zx_status_t fdio_default_sync(fdio_t* io) {
30    return ZX_ERR_NOT_SUPPORTED;
31}
32
33zx_status_t fdio_default_readdir(fdio_t* io, void* ptr, size_t max, size_t* actual) {
34    return ZX_ERR_NOT_SUPPORTED;
35}
36
37zx_status_t fdio_default_rewind(fdio_t* io) {
38    return ZX_ERR_NOT_SUPPORTED;
39}
40
41zx_status_t fdio_default_unlink(fdio_t* io, const char* path, size_t len) {
42    return ZX_ERR_NOT_SUPPORTED;
43}
44
45zx_status_t fdio_default_truncate(fdio_t* io, off_t off) {
46    return ZX_ERR_NOT_SUPPORTED;
47}
48
49zx_status_t fdio_default_rename(fdio_t* io, const char* src, size_t srclen,
50                                zx_handle_t dst_token, const char* dst, size_t dstlen) {
51    zx_handle_close(dst_token);
52    return ZX_ERR_NOT_SUPPORTED;
53}
54
55zx_status_t fdio_default_link(fdio_t* io, const char* src, size_t srclen,
56                              zx_handle_t dst_token, const char* dst, size_t dstlen) {
57    zx_handle_close(dst_token);
58    return ZX_ERR_NOT_SUPPORTED;
59}
60
61zx_status_t fdio_default_get_flags(fdio_t* io, uint32_t* out_flags) {
62    return ZX_ERR_NOT_SUPPORTED;
63}
64
65zx_status_t fdio_default_set_flags(fdio_t* io, uint32_t flags) {
66    return ZX_ERR_NOT_SUPPORTED;
67}
68
69ssize_t fdio_default_read(fdio_t* io, void* _data, size_t len) {
70    return 0;
71}
72
73ssize_t fdio_default_read_at(fdio_t* io, void* _data, size_t len, off_t offset) {
74    return ZX_ERR_WRONG_TYPE;
75}
76
77ssize_t fdio_default_write(fdio_t* io, const void* _data, size_t len) {
78    return len;
79}
80
81ssize_t fdio_default_write_at(fdio_t* io, const void* _data, size_t len, off_t offset) {
82    return ZX_ERR_WRONG_TYPE;
83}
84
85ssize_t fdio_default_recvfrom(fdio_t* io, void* data, size_t len, int flags, struct sockaddr* restrict addr, socklen_t* restrict addrlen) {
86    return ZX_ERR_WRONG_TYPE;
87}
88
89ssize_t fdio_default_sendto(fdio_t* io, const void* data, size_t len, int flags, const struct sockaddr* addr, socklen_t addrlen) {
90    return ZX_ERR_WRONG_TYPE;
91}
92
93ssize_t fdio_default_recvmsg(fdio_t* io, struct msghdr* msg, int flags) {
94    return ZX_ERR_WRONG_TYPE;
95}
96
97ssize_t fdio_default_sendmsg(fdio_t* io, const struct msghdr* msg, int flags) {
98    return ZX_ERR_WRONG_TYPE;
99}
100
101off_t fdio_default_seek(fdio_t* io, off_t offset, int whence) {
102    return ZX_ERR_WRONG_TYPE;
103}
104
105zx_status_t fdio_default_misc(fdio_t* io, uint32_t op, int64_t off, uint32_t arg, void* data, size_t len) {
106    return ZX_ERR_NOT_SUPPORTED;
107}
108
109zx_status_t fdio_default_open(fdio_t* io, const char* path, uint32_t flags, uint32_t mode, fdio_t** out) {
110    return ZX_ERR_NOT_SUPPORTED;
111}
112
113zx_status_t fdio_default_clone(fdio_t* io, zx_handle_t* handles, uint32_t* types) {
114    return ZX_ERR_NOT_SUPPORTED;
115}
116
117zx_status_t fdio_default_unwrap(fdio_t* io, zx_handle_t* handles, uint32_t* types) {
118    return ZX_ERR_NOT_SUPPORTED;
119}
120
121zx_status_t fdio_default_shutdown(fdio_t* io, int how) {
122    return ZX_ERR_WRONG_TYPE;
123}
124
125zx_status_t fdio_default_close(fdio_t* io) {
126    return ZX_OK;
127}
128
129ssize_t fdio_default_ioctl(fdio_t* io, uint32_t op, const void* in_buf,
130                           size_t in_len, void* out_buf, size_t out_len) {
131    return ZX_ERR_NOT_SUPPORTED;
132}
133
134void fdio_default_wait_begin(fdio_t* io, uint32_t events,
135                             zx_handle_t* handle, zx_signals_t* _signals) {
136    *handle = ZX_HANDLE_INVALID;
137}
138
139void fdio_default_wait_end(fdio_t* io, zx_signals_t signals, uint32_t* _events) {
140}
141
142ssize_t fdio_default_posix_ioctl(fdio_t* io, int req, va_list va) {
143    return ZX_ERR_NOT_SUPPORTED;
144}
145
146zx_status_t fdio_default_get_vmo(fdio_t* io, int flags, zx_handle_t* out) {
147    return ZX_ERR_NOT_SUPPORTED;
148}
149
150static fdio_ops_t zx_null_ops = {
151    .read = fdio_default_read,
152    .read_at = fdio_default_read_at,
153    .write = fdio_default_write,
154    .write_at = fdio_default_write_at,
155    .seek = fdio_default_seek,
156    .misc = fdio_default_misc,
157    .close = fdio_default_close,
158    .open = fdio_default_open,
159    .clone = fdio_default_clone,
160    .ioctl = fdio_default_ioctl,
161    .wait_begin = fdio_default_wait_begin,
162    .wait_end = fdio_default_wait_end,
163    .unwrap = fdio_default_unwrap,
164    .posix_ioctl = fdio_default_posix_ioctl,
165    .get_vmo = fdio_default_get_vmo,
166    .get_token = fdio_default_get_token,
167    .get_attr = fdio_default_get_attr,
168    .set_attr = fdio_default_set_attr,
169    .sync = fdio_default_sync,
170    .readdir = fdio_default_readdir,
171    .rewind = fdio_default_rewind,
172    .unlink = fdio_default_unlink,
173    .truncate = fdio_default_truncate,
174    .rename = fdio_default_rename,
175    .link = fdio_default_link,
176    .get_flags = fdio_default_get_flags,
177    .set_flags = fdio_default_set_flags,
178    .recvfrom = fdio_default_recvfrom,
179    .sendto = fdio_default_sendto,
180    .recvmsg = fdio_default_recvmsg,
181    .sendmsg = fdio_default_sendmsg,
182    .shutdown = fdio_default_shutdown,
183};
184
185__EXPORT
186fdio_t* fdio_null_create(void) {
187    fdio_t* io = fdio_alloc(sizeof(*io));
188    if (io == NULL) {
189        return NULL;
190    }
191    io->ops = &zx_null_ops;
192    io->magic = FDIO_MAGIC;
193    atomic_init(&io->refcount, 1);
194    return io;
195}
196