// Copyright 2017 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/fdio.h>
#include <lib/fdio/io.h>
#include <lib/fdio/vfs.h>
#include <zircon/process.h>
#include <zircon/syscalls.h>

#include "fdio_unistd.h"

__EXPORT
zx_status_t fdio_get_vmo_copy(int fd, zx_handle_t* out_vmo) {
  fdio_t* io = fd_to_io(fd);
  if (io == nullptr) {
    return ZX_ERR_BAD_HANDLE;
  }
  zx_status_t status = zxio_vmo_get_copy(fdio_get_zxio(io), out_vmo, nullptr);
  fdio_release(io);
  return status;
}

__EXPORT
zx_status_t fdio_get_vmo_clone(int fd, zx_handle_t* out_vmo) {
  fdio_t* io = fd_to_io(fd);
  if (io == nullptr) {
    return ZX_ERR_BAD_HANDLE;
  }
  zx_status_t status = zxio_vmo_get_clone(fdio_get_zxio(io), out_vmo, nullptr);
  fdio_release(io);
  return status;
}

__EXPORT
zx_status_t fdio_get_vmo_exact(int fd, zx_handle_t* out_vmo) {
  fdio_t* io = fd_to_io(fd);
  if (io == nullptr) {
    return ZX_ERR_BAD_HANDLE;
  }
  zx_status_t status = zxio_vmo_get_exact(fdio_get_zxio(io), out_vmo, nullptr);
  fdio_release(io);
  return status;
}

__EXPORT
zx_status_t fdio_get_vmo_exec(int fd, zx_handle_t* out_vmo) {
  fdio_t* io = fd_to_io(fd);
  if (io == nullptr) {
    return ZX_ERR_BAD_HANDLE;
  }

  zx_status_t status = zxio_vmo_get_exec(fdio_get_zxio(io), out_vmo, nullptr);
  fdio_release(io);
  return status;
}
