| // 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. |
| |
| #ifndef LIB_FDIO_NAMESPACE_H_ |
| #define LIB_FDIO_NAMESPACE_H_ |
| |
| #include <stdint.h> |
| #include <zircon/availability.h> |
| #include <zircon/compiler.h> |
| #include <zircon/types.h> |
| |
| __BEGIN_CDECLS |
| |
| typedef struct fdio_namespace fdio_ns_t; |
| typedef struct zxio_ops zxio_ops_t; |
| typedef struct zxio_storage zxio_storage_t; |
| |
| // Create a new, empty namespace |
| zx_status_t fdio_ns_create(fdio_ns_t** out) ZX_AVAILABLE_SINCE(1); |
| |
| // Destroy and deallocate a namespace. |
| // |
| // If the namespace is in-use, it will be destroyed once it is no longer referenced. |
| // |
| // This function always returns `ZX_OK`. |
| zx_status_t fdio_ns_destroy(fdio_ns_t* ns) ZX_AVAILABLE_SINCE(1); |
| |
| // Callback function for the `fdio_ns_bind_local` function. |
| typedef zx_status_t (*fdio_open_local_func_t)(zxio_storage_t*, void*, zxio_ops_t const**) |
| ZX_AVAILABLE_SINCE(10); |
| |
| // Create a new local entry within a namespace. |
| // |
| // Opening the path will run the given `on_open` with the given `context` to |
| // populate the file. The callback must set the zxio operations table, and can |
| // set an internal state inside the provided storage. |
| // |
| // The path must be an absolute path like "/x/y/z". It is relative to the root |
| // of the namespace. |
| // |
| // # Errors |
| // |
| // * `ZX_ERR_BAD_STATE`: Namespace is already in use and immutable. |
| // |
| // * `ZX_ERR_ALREADY_EXISTS`: There is already a mounted directory there. |
| // |
| // * `ZX_ERR_NOT_SUPPORTED`: `path` would shadow a mounted directory. |
| // |
| // * `ZX_ERR_INVALID_ARGS`: `path` is null or is not an absolute path. |
| // |
| // * `ZX_ERR_BAD_PATH`: `path` is not a valid path. |
| zx_status_t fdio_ns_bind_local(fdio_ns_t* ns, const char* path, fdio_open_local_func_t on_open, |
| void* context) ZX_AVAILABLE_SINCE(10); |
| |
| // Create a new directory within a namespace, bound to the directory-protocol-compatible handle h |
| // |
| // The path must be an absolute path like "/x/y/z". It is relative to the root |
| // of the namespace. |
| // |
| // Ownership of `h` is transferred to `ns`: it is closed on error. |
| // |
| // # Errors |
| // |
| // * `ZX_ERR_BAD_STATE`: Namespace is already in use and immutable. |
| // |
| // * `ZX_ERR_ALREADY_EXISTS`: There is already a mounted directory there. |
| // |
| // * `ZX_ERR_NOT_SUPPORTED`: `path` would shadow a mounted directory. |
| // |
| // * `ZX_ERR_INVALID_ARGS`: `path` is null or is not an absolute path. |
| // |
| // * `ZX_ERR_BAD_PATH`: `path` is not a valid path. |
| zx_status_t fdio_ns_bind(fdio_ns_t* ns, const char* path, zx_handle_t h) ZX_AVAILABLE_SINCE(1); |
| |
| // Unbinds `path` from a namespace, closing the handle within `ns` that corresponds to that path |
| // when all references to the node go out of scope. |
| // |
| // # Errors |
| // |
| // * `ZX_ERR_NOT_FOUND: `path` is not a remote. |
| // |
| // * `ZX_ERR_NOT_SUPPORTED: `path` is the root of the namespace. |
| // |
| // * `ZX_ERR_INVALID_ARGS: `path` is null or not an absolute path. |
| // |
| // * `ZX_ERR_BAD_PATH: `path` is not a valid path. |
| zx_status_t fdio_ns_unbind(fdio_ns_t* ns, const char* path) ZX_AVAILABLE_SINCE(1); |
| |
| // Whether `path` is bound to a remote directory in `ns`. |
| bool fdio_ns_is_bound(fdio_ns_t* ns, const char* path) ZX_AVAILABLE_SINCE(1); |
| |
| // Create a new directory within a namespace, bound to the |
| // directory referenced by the file descriptor fd. |
| // The path must be an absolute path like "/x/y/z". It is relative to the root |
| // of the namespace. |
| // |
| // `fd` is borrowed by this function, but is not closed on success or error. |
| // Closing the fd after success does not affect namespace. |
| // |
| // # Errors |
| // |
| // * `ZX_ERR_BAD_STATE: Namespace is already in use and immutable or `fd` cannot be cloned in its |
| // current state. |
| // |
| // * `ZX_ERR_ALREADY_EXISTS: There is already a mounted directory there. |
| // |
| // * `ZX_ERR_NOT_SUPPORTED: `path` would shadow a mounted directory or `fd` cannot |
| // be represented as a handle. |
| // |
| // * `ZX_ERR_INVALID_ARGS: `path` is null or is not an absolute path or `fd` is not |
| // a valid file descriptor. |
| // |
| // * `ZX_ERR_BAD_PATH: `path` is not a valid path. |
| // |
| // * `ZX_ERR_ACCESS_DENIED: `fd` has insufficient rights to clone the underlying |
| // object. |
| zx_status_t fdio_ns_bind_fd(fdio_ns_t* ns, const char* path, int fd) ZX_AVAILABLE_SINCE(1); |
| |
| // Opens the root directory of the namespace as a file descriptor |
| int fdio_ns_opendir(fdio_ns_t* ns) ZX_AVAILABLE_SINCE(1); |
| |
| // Changes the current directory to "/" in the provided namespace. |
| zx_status_t fdio_ns_chdir(fdio_ns_t* ns) ZX_AVAILABLE_SINCE(1); |
| |
| // Retrieve the fdio "global" namespace (if any). |
| zx_status_t fdio_ns_get_installed(fdio_ns_t** ns) ZX_AVAILABLE_SINCE(1); |
| |
| // Contains parallel arrays of handles, path names, and types. |
| typedef struct fdio_flat_namespace { |
| // The number of elements in the other arrays of this struct. |
| size_t count; |
| |
| // handle[i] is the zx_handle_t representing that element in the namespace. |
| zx_handle_t* handle; |
| |
| // path[i] is the user-readable name of that element (e.g., "/bin"). |
| const char* const* path; |
| } fdio_flat_namespace_t ZX_AVAILABLE_SINCE(1); |
| |
| // On success the caller takes ownership of a fdio_flat_namespace_t containing a flat representation |
| // of the exported namespace (the one provided in 'ns' or the active root namespace, respectively.) |
| // The handles are CLONEs of the handles in the namespace and also belong to the caller. |
| // |
| // The whole data structure can be released with fdio_ns_free_flat_ns(). |
| zx_status_t fdio_ns_export(fdio_ns_t* ns, fdio_flat_namespace_t** out) ZX_AVAILABLE_SINCE(1); |
| zx_status_t fdio_ns_export_root(fdio_flat_namespace_t** out) ZX_AVAILABLE_SINCE(1); |
| |
| // Attempt to connect to a service through the namespace. The handle is always consumed. It will be |
| // closed on error or passed to the remote service on success. The path must be an absolute path |
| // starting with "/". |
| zx_status_t |
| fdio_ns_connect(fdio_ns_t* ns, const char* path, uint32_t flags, zx_handle_t request) ZX_DEPRECATED_SINCE( |
| 1, 8, |
| "Incorrectly named due to accepting flags. Use fdio_ns_open or fdio_ns_service_connect instead."); |
| |
| // Opens an object at `path` relative to the root of `ns` with `flags` asynchronously. |
| // |
| // `path` is looked up in `ns`. If found, the object at `path` is opened, passing `request` to the |
| // remote party. |
| // |
| // Upon success, `request` is handed off to the remote party. The operation completes |
| // asynchronously, which means a ZX_OK result does not ensure that the requested service actually |
| // exists. |
| // |
| // `path` must be absolute. |
| // |
| // `flags` is a `fuchsia.io/OpenFlags`. |
| // |
| // `request` must be a channel and it is always consumed by this function. |
| // |
| // # Errors |
| // |
| // * `ZX_ERR_INVALID_ARGS`: `path` is invalid. |
| // |
| // * `ZX_ERR_NOT_FOUND`: A prefix of `path` cannot be found in `ns`. |
| zx_status_t fdio_ns_open(fdio_ns_t* ns, const char* path, uint32_t flags, zx_handle_t request) |
| ZX_AVAILABLE_SINCE(8); |
| |
| // Connects to a service at `path` relative to the root of `ns` asynchronously. |
| // |
| // `path` is looked up in `ns`. If found, the object at `path` is opened, passing `request` to the |
| // remote party. |
| // |
| // Upon success, `request` is handed off to the remote party. The operation completes |
| // asynchronously, which means a ZX_OK result does not ensure that the requested service actually |
| // exists. |
| // |
| // `path` must be absolute. |
| // |
| // `request` must be a channel and it is always consumed by this function. |
| // |
| // # Errors |
| // |
| // * `ZX_ERR_INVALID_ARGS`: `path` is invalid. |
| // |
| // * `ZX_ERR_NOT_FOUND`: A prefix of `path` cannot be found in `ns`. |
| zx_status_t fdio_ns_service_connect(fdio_ns_t* ns, const char* path, zx_handle_t request) |
| ZX_AVAILABLE_SINCE(8); |
| |
| // Frees a flat namespace. |
| // |
| // Closes all handles contained within `ns`. |
| void fdio_ns_free_flat_ns(fdio_flat_namespace_t* ns) ZX_AVAILABLE_SINCE(1); |
| |
| __END_CDECLS |
| |
| #endif // LIB_FDIO_NAMESPACE_H_ |