| // 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; |
| }; |