blob: a37fac87c36294cdbe49279d7a5c04af9fa01389 [file] [log] [blame]
// Copyright 2019 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.
library zx;
@transport("Syscall")
@no_protocol_prefix
closed protocol Handlefuncs {
/// ## Summary
///
/// Close a handle.
///
/// ## Declaration
///
/// ```c
/// #include <zircon/syscalls.h>
///
/// zx_status_t zx_handle_close(zx_handle_t handle);
/// ```
///
/// ## Description
///
/// `zx_handle_close()` closes a *handle*, causing the underlying object to be
/// reclaimed by the kernel if no other handles to it exist.
///
/// If the *handle* was used in a pending [`zx_object_wait_one()`] or a
/// [`zx_object_wait_many()`] call, the wait will be aborted.
///
/// It is not an error to close the special "never a valid handle" `ZX_HANDLE_INVALID`,
/// similar to `free(NULL)` being a valid call.
///
/// Closing the last handle to a peered object using `zx_handle_close()` can affect
/// the state of the object's peer (if any). See also
/// [peered-objects][peered-objects].
///
/// ## Rights
///
/// None.
///
/// ## Return value
///
/// `zx_handle_close()` returns `ZX_OK` on success.
///
/// ## Errors
///
/// `ZX_ERR_BAD_HANDLE` *handle* isn't a valid handle.
///
/// ## See also
///
/// <!-- Reference links -->
/// [peered-objects]: /docs/reference/kernel_objects/objects.md#peered-objects-and-the-peer-closed-state
///
/// - [`zx_handle_close_many()`]
/// - [`zx_handle_duplicate()`]
/// - [`zx_handle_replace()`]
///
/// [`zx_handle_close_many()`]: handle_close_many.md
/// [`zx_handle_duplicate()`]: handle_duplicate.md
/// [`zx_handle_replace()`]: handle_replace.md
/// [`zx_object_wait_many()`]: object_wait_many.md
/// [`zx_object_wait_one()`]: object_wait_one.md
strict HandleClose(resource struct {
@release
handle Handle;
}) -> () error Status;
/// ## Summary
///
/// Close a number of handles.
///
/// ## Declaration
///
/// ```c
/// #include <zircon/syscalls.h>
///
/// zx_status_t zx_handle_close_many(const zx_handle_t* handles,
/// size_t num_handles);
/// ```
///
/// ## Description
///
/// `zx_handle_close_many()` closes a number of handles, causing each
/// underlying object to be reclaimed by the kernel if no other handles to
/// it exist.
///
/// If a handle was used in a pending [`zx_object_wait_one()`] or a
/// [`zx_object_wait_many()`] call, the wait will be aborted.
///
/// This operation closes all handles presented to it, even if one or more
/// of the handles is duplicate or invalid.
///
/// It is not an error to close the special "never a valid handle" `ZX_HANDLE_INVALID`,
/// similar to `free(NULL)` being a valid call.
///
/// Closing the last handle to a peered object using `zx_handle_close_many()` can
/// affect the state of the object's peer (if any). See also
/// [peered-objects][peered-objects].
///
/// ## Rights
///
/// None.
///
/// ## Return value
///
/// `zx_handle_close_many()` returns `ZX_OK` on success.
///
/// ## Errors
///
/// `ZX_ERR_BAD_HANDLE` One of the *handles* isn't a valid handle, or the same handle is
/// present multiple times.
///
/// ## See also
///
/// <!-- Reference links -->
/// [peered-objects]: /docs/reference/kernel_objects/objects.md#peered-objects-and-the-peer-closed-state
///
/// - [`zx_handle_close()`]
/// - [`zx_handle_duplicate()`]
/// - [`zx_handle_replace()`]
///
/// [`zx_handle_close()`]: handle_close.md
/// [`zx_handle_duplicate()`]: handle_duplicate.md
/// [`zx_handle_replace()`]: handle_replace.md
/// [`zx_object_wait_many()`]: object_wait_many.md
/// [`zx_object_wait_one()`]: object_wait_one.md
strict HandleCloseMany(resource struct {
@release
handles vector<Handle>:MAX;
}) -> () error Status;
/// ## Summary
///
/// Duplicate a handle.
///
/// ## Declaration
///
/// ```c
/// #include <zircon/syscalls.h>
///
/// zx_status_t zx_handle_duplicate(zx_handle_t handle,
/// zx_rights_t rights,
/// zx_handle_t* out);
/// ```
///
/// ## Description
///
/// `zx_handle_duplicate()` creates a duplicate of *handle*, referring
/// to the same underlying object, with new access rights *rights*.
///
/// To duplicate the handle with the same rights use `ZX_RIGHT_SAME_RIGHTS`. If different
/// rights are desired they must be strictly lesser than of the source handle. It is possible
/// to specify no rights by using `ZX_RIGHT_NONE`. To remove `ZX_RIGHT_DUPLICATE` right when
/// transferring through a channel, use [`zx_channel_write_etc()`].
///
/// ## Rights
///
/// *handle* must have `ZX_RIGHT_DUPLICATE`.
///
/// ## Return value
///
/// `zx_handle_duplicate()` returns `ZX_OK` and the duplicate handle via *out* on success.
///
/// ## Errors
///
/// `ZX_ERR_BAD_HANDLE` *handle* isn't a valid handle.
///
/// `ZX_ERR_INVALID_ARGS` The *rights* requested are not a subset of *handle* rights or
/// *out* is an invalid pointer.
///
/// `ZX_ERR_ACCESS_DENIED` *handle* does not have `ZX_RIGHT_DUPLICATE` and may not be duplicated.
///
/// `ZX_ERR_NO_MEMORY` Failure due to lack of memory.
/// There is no good way for userspace to handle this (unlikely) error.
/// In a future build this error will no longer occur.
///
/// ## See also
///
/// - [rights]
/// - [`zx_channel_write_etc()`]
/// - [`zx_handle_close()`]
/// - [`zx_handle_close_many()`]
/// - [`zx_handle_replace()`]
///
/// [rights]: /docs/concepts/kernel/rights.md
/// [`zx_channel_write_etc()`]: channel_write_etc.md
/// [`zx_handle_close()`]: handle_close.md
/// [`zx_handle_close_many()`]: handle_close_many.md
/// [`zx_handle_replace()`]: handle_replace.md
strict HandleDuplicate(resource struct {
handle Handle;
rights Rights;
}) -> (resource struct {
out Handle;
}) error Status;
/// ## Summary
///
/// Replace a handle.
///
/// ## Declaration
///
/// ```c
/// #include <zircon/syscalls.h>
///
/// zx_status_t zx_handle_replace(zx_handle_t handle,
/// zx_rights_t rights,
/// zx_handle_t* out);
/// ```
///
/// ## Description
///
/// `zx_handle_replace()` creates a replacement for *handle*, referring to
/// the same underlying object, with new access rights *rights*.
///
/// *handle* is always invalidated.
///
/// If *rights* is `ZX_RIGHT_SAME_RIGHTS`, the replacement handle will
/// have the same rights as the original handle. Otherwise, *rights* must be
/// a subset of original handle's rights.
///
/// ## Rights
///
/// None.
///
/// ## Return value
///
/// `zx_handle_replace()` returns `ZX_OK` and the replacement handle (via *out*)
/// on success.
///
/// ## Errors
///
/// `ZX_ERR_BAD_HANDLE` *handle* isn't a valid handle.
///
/// `ZX_ERR_INVALID_ARGS` The *rights* requested are not a subset of
/// *handle*'s rights or *out* is an invalid pointer.
///
/// `ZX_ERR_NO_MEMORY` Failure due to lack of memory.
/// There is no good way for userspace to handle this (unlikely) error.
/// In a future build this error will no longer occur.
///
/// ## See also
///
/// - [`zx_handle_close()`]
/// - [`zx_handle_close_many()`]
/// - [`zx_handle_duplicate()`]
///
/// [`zx_handle_close()`]: handle_close.md
/// [`zx_handle_close_many()`]: handle_close_many.md
/// [`zx_handle_duplicate()`]: handle_duplicate.md
strict HandleReplace(resource struct {
@release
handle Handle;
rights Rights;
}) -> (resource struct {
out Handle;
}) error Status;
};