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

#include "private.h"
#include "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;
}
