// Copyright 2021 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/fdio/io.h>

#include "fdio_unistd.h"
#include "zxio.h"

__EXPORT
zx_status_t fdio_wait_fd(int fd, uint32_t events, uint32_t* out_pending, zx_time_t deadline) {
  fdio_ptr io = fd_to_io(fd);
  if (io == nullptr) {
    return ZX_ERR_BAD_HANDLE;
  }
  return fdio_wait(io, events, zx::time(deadline), out_pending);
}

__EXPORT
int fdio_handle_fd(zx_handle_t h, zx_signals_t signals_in, zx_signals_t signals_out,
                   bool shared_handle) {
  auto handle = [h, shared_handle]() -> std::variant<zx::handle, zx::unowned_handle> {
    if (shared_handle) {
      return zx::unowned_handle(h);
    }
    return zx::handle(h);
  };
  zx::status io = fdio_waitable_create(handle(), signals_in, signals_out);
  if (io.is_error()) {
    return ERROR(io.status_value());
  }
  std::optional fd = bind_to_fd(io.value());
  if (fd.has_value()) {
    return fd.value();
  }
  return ERRNO(EMFILE);
}

__EXPORT
zx_status_t fdio_pipe_half(int* out_fd, zx_handle_t* out_handle) {
  zx::socket h0, h1;
  zx_status_t status = zx::socket::create(0, &h0, &h1);
  if (status != ZX_OK) {
    return status;
  }
  zx::status io = fdio_internal::pipe::create(std::move(h0));
  if (io.is_error()) {
    return io.status_value();
  }
  std::optional fd = bind_to_fd(io.value());
  if (fd.has_value()) {
    *out_fd = fd.value();
    *out_handle = h1.release();
    return ZX_OK;
  }
  return ZX_ERR_NO_RESOURCES;
}

namespace {

template <typename F>
zx_status_t with_zxio(int fd, F fn, zx_handle_t* out_vmo) {
  fdio_ptr io = fd_to_io(fd);
  if (io == nullptr) {
    return ZX_ERR_BAD_HANDLE;
  }
  return fn(&io->zxio_storage().io, out_vmo, nullptr);
}

}  // namespace

__EXPORT
zx_status_t fdio_get_vmo_copy(int fd, zx_handle_t* out_vmo) {
  return with_zxio(fd, zxio_vmo_get_copy, out_vmo);
}

__EXPORT
zx_status_t fdio_get_vmo_clone(int fd, zx_handle_t* out_vmo) {
  return with_zxio(fd, zxio_vmo_get_clone, out_vmo);
}

__EXPORT
zx_status_t fdio_get_vmo_exact(int fd, zx_handle_t* out_vmo) {
  return with_zxio(fd, zxio_vmo_get_exact, out_vmo);
}

__EXPORT
zx_status_t fdio_get_vmo_exec(int fd, zx_handle_t* out_vmo) {
  return with_zxio(fd, zxio_vmo_get_exec, out_vmo);
}
