blob: 9d2d84fd203bbe8c09848b918c4b088d3c240690 [file] [log] [blame]
// Copyright 2016 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 <fdio/io.h>
#include <stdatomic.h>
#include <stdlib.h>
#include <threads.h>
#include <zircon/syscalls.h>
#include "private.h"
typedef struct fdio_out fdio_out_t;
struct fdio_out {
fdio_t io;
ssize_t (*func)(void* cookie, const void* data, size_t len);
void* cookie;
};
static ssize_t log_write(fdio_t* io, const void* data, size_t len) {
fdio_out_t* out = (void*)io;
return out->func(out->cookie, data, len);
}
static zx_status_t log_close(fdio_t* io) {
return ZX_OK;
}
static fdio_ops_t out_io_ops = {
.read = fdio_default_read,
.read_at = fdio_default_read_at,
.write = log_write,
.write_at = fdio_default_write_at,
.recvfrom = fdio_default_recvfrom,
.sendto = fdio_default_sendto,
.recvmsg = fdio_default_recvmsg,
.sendmsg = fdio_default_sendmsg,
.seek = fdio_default_seek,
.misc = fdio_default_misc,
.close = fdio_default_close,
.open = fdio_default_open,
.clone = fdio_default_clone,
.ioctl = fdio_default_ioctl,
.wait_begin = fdio_default_wait_begin,
.wait_end = fdio_default_wait_end,
.unwrap = fdio_default_unwrap,
.shutdown = fdio_default_shutdown,
.posix_ioctl = fdio_default_posix_ioctl,
.get_vmo = fdio_default_get_vmo,
};
fdio_t* fdio_output_create(ssize_t (*func)(void* cookie, const void* data, size_t len),
void* cookie) {
fdio_out_t* out = calloc(1, sizeof(fdio_out_t));
if (out == NULL) {
return NULL;
}
out->io.ops = &out_io_ops;
out->io.magic = FDIO_MAGIC;
atomic_init(&out->io.refcount, 1);
out->func = func;
out->cookie = cookie;
return &out->io;
}