blob: 1dab9559326e5a67caff3e5dc05767916b57aec2 [file] [log] [blame]
// 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.
#ifndef LIB_ZXIO_OPS_H_
#define LIB_ZXIO_OPS_H_
#include <lib/zxio/types.h>
#include <lib/zxio/zxio.h>
#include <stdint.h>
#include <zircon/compiler.h>
#include <zircon/types.h>
__BEGIN_CDECLS
// See zxio.h
typedef struct zxio {
uint64_t reserved[4];
} zxio_t;
// Storage for the |zxio_ops_t| implementation.
typedef struct zxio_private {
uint64_t reserved[6];
} zxio_private_t;
// The storage backing a |zxio_t|.
typedef struct zxio_storage {
zxio_t io;
zxio_private_t reserved;
} zxio_storage_t;
// A table of operations for a zxio_t.
//
// Most of the functions that operate on a zxio_t call through this operations
// table to actually perform the operation. Use |zxio_alloc| to create a zxio_t
// with a custom operations table.
typedef struct zxio_ops zxio_ops_t;
// Initialize a |zxio_t| object with the given |ops| table.
void zxio_init(zxio_t* io, const zxio_ops_t* ops);
struct zxio_ops {
// After |release| returns, no further ops will be called relative to |ctx|.
zx_status_t (*release)(zxio_t* io, zx_handle_t* out_handle);
// After |close| returns, no further ops will be called relative to |ctx|.
zx_status_t (*close)(zxio_t* io);
void (*wait_begin)(zxio_t* io, zxio_signals_t zxio_signals,
zx_handle_t* out_handle, zx_signals_t* out_zx_signals);
void (*wait_end)(zxio_t* io, zx_signals_t zx_signals,
zxio_signals_t* out_zxio_signals);
zx_status_t (*clone_async)(zxio_t* io, uint32_t flags, zx_handle_t request);
zx_status_t (*sync)(zxio_t* io);
zx_status_t (*attr_get)(zxio_t* io, zxio_node_attr_t* out_attr);
zx_status_t (*attr_set)(zxio_t* io, uint32_t flags,
const zxio_node_attr_t* attr);
zx_status_t (*read)(zxio_t* io, void* buffer, size_t capacity,
size_t* out_actual);
zx_status_t (*read_at)(zxio_t* io, size_t offset, void* buffer,
size_t capacity, size_t* out_actual);
zx_status_t (*write)(zxio_t* io, const void* buffer, size_t capacity,
size_t* out_actual);
zx_status_t (*write_at)(zxio_t* io, size_t offset, const void* buffer,
size_t capacity, size_t* out_actual);
zx_status_t (*seek)(zxio_t* io, size_t offset, zxio_seek_origin_t start,
size_t* out_offset);
zx_status_t (*truncate)(zxio_t* io, size_t length);
zx_status_t (*flags_get)(zxio_t* io, uint32_t* out_flags);
zx_status_t (*flags_set)(zxio_t* io, uint32_t flags);
zx_status_t (*vmo_get)(zxio_t* io, uint32_t flags, zx_handle_t* out_vmo,
size_t* out_size);
zx_status_t (*open)(zxio_t* io, uint32_t flags, uint32_t mode,
const char* path, zxio_t** out_io);
zx_status_t (*open_async)(zxio_t* io, uint32_t flags, uint32_t mode,
const char* path, zx_handle_t request);
zx_status_t (*unlink)(zxio_t* io, const char* path);
zx_status_t (*token_get)(zxio_t* io, zx_handle_t* out_token);
zx_status_t (*rename)(zxio_t* io, const char* src_path,
zx_handle_t dst_token, const char* dst_path);
zx_status_t (*link)(zxio_t* io, const char* src_path, zx_handle_t dst_token,
const char* dst_path);
zx_status_t (*readdir)(zxio_t* io, void* buffer, size_t capacity,
size_t* out_actual);
zx_status_t (*rewind)(zxio_t* io);
};
__END_CDECLS
#endif // LIB_ZXIO_OPS_H_