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