// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#include <err.h>
#include <inttypes.h>
#include <trace.h>

#include <object/handle.h>
#include <object/process_dispatcher.h>

#include "priv.h"

#define LOCAL_TRACE 0

zx_status_t sys_handle_close(zx_handle_t handle_value) {
    LTRACEF("handle %x\n", handle_value);

    // Closing the "never a handle" invalid handle is not an error
    // It's like free(NULL).
    if (handle_value == ZX_HANDLE_INVALID)
        return ZX_OK;
    auto up = ProcessDispatcher::GetCurrent();
    HandleOwner handle(up->RemoveHandle(handle_value));
    if (!handle)
        return ZX_ERR_BAD_HANDLE;
    return ZX_OK;
}

zx_status_t sys_handle_close_many(user_in_ptr<const zx_handle_t> handles, size_t num_handles) {
    LTRACEF("handles %p, num_handles %zu\n", handles.get(), num_handles);

    auto up = ProcessDispatcher::GetCurrent();
    return up->RemoveHandles(handles, num_handles);
}

static zx_status_t handle_dup_replace(
    bool is_replace, zx_handle_t handle_value, zx_rights_t rights,
    user_out_handle* out) {
    LTRACEF("handle %x\n", handle_value);

    auto up = ProcessDispatcher::GetCurrent();

    Guard<fbl::Mutex> guard{up->handle_table_lock()};
    auto source = up->GetHandleLocked(handle_value);
    if (!source)
        return ZX_ERR_BAD_HANDLE;

    if (!is_replace) {
        if (!source->HasRights(ZX_RIGHT_DUPLICATE))
            return ZX_ERR_ACCESS_DENIED;
    }

    if (rights == ZX_RIGHT_SAME_RIGHTS) {
        rights = source->rights();
    } else if ((source->rights() & rights) != rights) {
        if (is_replace)
            up->RemoveHandleLocked(handle_value);
        return ZX_ERR_INVALID_ARGS;
    }

    zx_status_t status = out->dup(source, rights);

    if (is_replace)
        up->RemoveHandleLocked(handle_value);

    return status;
}

zx_status_t sys_handle_duplicate(
    zx_handle_t handle_value, zx_rights_t rights, user_out_handle* out) {
    return handle_dup_replace(false, handle_value, rights, out);
}

zx_status_t sys_handle_replace(
    zx_handle_t handle_value, zx_rights_t rights, user_out_handle* out) {
    return handle_dup_replace(true, handle_value, rights, out);
}
