Google is committed to advancing racial equity for Black communities. See how.

fuchsia.io

PROTOCOLS

Directory

Defined in fuchsia.io/directory.fidl

Directory defines a node which is capable of containing other Objects.

AddInotifyFilter

Adds a new inotify filter for an object relative to this directory object.

  • 'filter` is a mask of different inotify events that need to be watched by the server for a specific file/directory.

  • path may contain multiple segments, separated by "/" characters, and should never be empty; i.e., "" is an invalid path. Paths should not contain a leading "/".

+watch_descriptor is client assigned value to identify a filter. Server shouldn't trust the client-assigned watch_descriptor. They should just send it back to the client in the socket. This value is not used by server, but it is returned back as part of InotifyEvent, to help the client correlate filter with events on this filter.

  • socket is shared between different filter objects i.e every new filter will have a different server end of the socket and there will be a single client end per inotify instance on inotify init.

Request

NameType
path fuchsia.io2/Path
filter fuchsia.io2/InotifyWatchMask
watch_descriptor uint32
socket handle<socket>

Response

<EMPTY>

AdvisoryLock

Acquires an advisory lock on the underlying file.

The lock lasts until either this connection is closed or this method is called with |AdvisoryLockType.UNLOCK| to release the lock explicitly.

Advisory locks are purely advisory. They do not prevent actual read or write operations from occurring on the file, either through this connection or through other connections.

This method requires the following rights:

Errors

  • ZX_ERR_BAD_STATE The specified type of lock cannot be acquired. For example, another connection might hold a conflicting lock type.
  • ZX_ERR_NOT_SUPPORTED This file does not support advisory locking.
  • ZX_ERR_ACCESS_DENIED This connection does not have sufficient rights to acquire the given type of lock.

Request

NameType
request fuchsia.io2/AdvisoryLockRequest

Response

NameType
result fuchsia.io2/AdvisoryLocking_AdvisoryLock_Result

Clone

Create another connection to the same remote object.

flags may be any of:

  • OPEN_RIGHT_*
  • OPEN_FLAG_APPEND
  • OPEN_FLAG_NO_REMOTE
  • OPEN_FLAG_DESCRIBE
  • CLONE_FLAG_SAME_RIGHTS

All other flags are ignored.

The OPEN_RIGHT_* bits in flags request corresponding rights over the resulting cloned object. The cloned object must have rights less than or equal to the original object, otherwise returns ZX_ERR_ACCESS_DENIED. Alternatively, pass CLONE_FLAG_SAME_RIGHTS to inherit the rights on the source connection. It is invalid to pass any of the OPEN_RIGHT_* flags together with CLONE_FLAG_SAME_RIGHTS.

Request

NameType
flags uint32
object request<Node>

Close

Terminates connection with object.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
s zx/status

Close2

Terminates connection with object.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
result Node_Close2_Result

Describe

Returns extra information about the type of the object. If the Describe operation fails, the connection is closed.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
info NodeInfo

Describe2

Returns extra connection information and auxiliary handles.

  • query specifies the fields in ConnectionInfo that the caller is interested in.

When all known bits in query are set, the return value matches the one from OnConnectionInfo, as if the caller requested that event using ConnectionFlags.GET_CONNECTION_INFO.

If the Describe operation fails, the connection is closed with the associated error.

This method does not require any rights.

Request

NameType
query ConnectionInfoQuery

Response

NameType
info ConnectionInfo

GetAttr

Acquires information about the node.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
s zx/status
attributes NodeAttributes

GetAttributes

Acquires information about the node.

The attributes of a node should be stable, independent of the specific protocol used to access it.

  • query a bit-mask specifying which attributes to fetch. The server should not return more than necessary.
  • attributes the returned attributes.

This method requires the Rights.GET_ATTRIBUTES right.

Request

NameType
query NodeAttributesQuery

Response

NameType
result Node_GetAttributes_Result

GetToken

Acquires a token to a Directory which can be used to identify access to it at a later point in time.

This method requires following rights: OPEN_RIGHT_WRITABLE, otherwise returns ZX_ERR_BAD_HANDLE.

Request

<EMPTY>

Response

NameType
s zx/status
token handle<handle>?

IoToIo2Placeholder

This message should never be sent or received.

This declaration exists to let keep the Rust bindings compiling as we add and remove transitional elements from the fuchsia.io protocols. Without this declaration, the users of the Rust bindings fail to compile when there aren't any transitional protocol elements.

DEPRECATED

Request

<EMPTY>

Creates a link to an object named src by the name dst, within a directory represented by token.

src must be a resolved object name. Including "/" in the string will return ZX_ERR_INVALID_ARGS.

dst must be a resolved object name. Including "/" in the string will return ZX_ERR_INVALID_ARGS.

This method requires following rights: OPEN_RIGHT_WRITABLE, otherwise returns ZX_ERR_BAD_HANDLE.

NameType
src string[255]
dst_parent_token handle<handle>
dst string[255]
NameType
s zx/status

NodeGetFlags

Acquires the Directory.Open rights and flags used to access this file.

This method does not require any rights. This method has the same functionality as GetFlags for File and is meant as an in-progress replacement.

Request

<EMPTY>

Response

NameType
s zx/status
flags uint32

NodeSetFlags

Changes the Directory.Open flags used to access the file. Supported flags which can be turned on / off:

  • OPEN_FLAG_APPEND

This method does not require any rights. This method has the same functionality as SetFlags for File and is meant as an in-progress replacement.

Request

NameType
flags uint32

Response

NameType
s zx/status

OnConnectionInfo

An event produced eagerly by the server if requested by ConnectionFlags.GET_CONNECTION_INFO. This event will be the first message from the server, and is sent exactly once.

Different from fuchsia.io/OnOpen, an error during open/reopen is always manifested as an epitaph.

Response

NameType
info ConnectionInfo

OnOpen

An event produced eagerly by a FIDL server if requested by OPEN_FLAG_DESCRIBE.

Indicates the success or failure of the open operation, and optionally describes the object. If the status is ZX_OK, info contains descriptive information about the object (the same as would be returned by Describe).

Response

NameType
s zx/status
info NodeInfo?

Open

Opens a new object relative to this directory object.

path may contain multiple segments, separated by "/" characters, and should never be empty; i.e. "" is an invalid path. A trailing slash implies OPEN_FLAG_DIRECTORY. Components must not be empty (i.e. "foo//bar" is invalid). ".." is disallowed anywhere in the path. "." is only allowed if the path is exactly ".", but not otherwise. A leading '/' is allowed (and is treated the same way as if not present, i.e. "/foo/bar' and "foo/bar" are the same).

flags may be any of the OPEN_FLAG_* and OPEN_RIGHT_* values, bitwise ORed together. The OPEN_FLAG_DESCRIBE flag may cause an OnOpen event to be transmitted on the object handle, indicating the type of object opened.

If an unknown value is sent for flags the connection should be closed.

OPEN_RIGHT_* flags provided in flags will restrict access rights on the object channel which will be connected to the opened entity.

Rights are never increased. When you open a nested entity within a directory, you may only request the same rights as what the directory connection already has, or a subset of those. Exceeding those rights causes an access denied error to be transmitted in the OnOpen event if applicable, and the object connection closed.

The caller must specify either one or more of the OPEN_RIGHT_* flags, or the OPEN_FLAG_NODE_REFERENCE flag.

mode is only used if an object is created and indicates the type of object to be created. An unsupported mode will cause the connection to be closed. The mode type, if set, must always be consistent with the OPEN_FLAG_DIRECTORY and OPEN_FLAG_NOT_DIRECTORY flags, even if an object is not being created. If an object is not being created, mode is otherwise ignored. If an object is being created and the mode type is not set, a directory will be created if OPEN_FLAG_DIRECTORY is set (explicitly or implicitly), or otherwise a server chosen object type.

Request

NameType
flags uint32
mode uint32
path string[4096]
object request<Node>

Open2

Opens or creates a new node relative to this directory node.

  • path identifies the node to open. If path contains multiple segments, then the directory is traversed, one segment at a time, relative to the directory represented by this connection. See fuchsia.io2/Path for what constitutes a valid path. To open another connection to the current directory, use fuchsia.io2/Node.Reopen instead.
  • mode controls whether to open existing/create new etc.
  • options additional options applicable to both Open and Reopen, including negotiating protocol and restricting rights. See fuchsia.io2/ConnectionOptions.
  • object_request is the server end of a channel created for the new connection. The caller may proceed to send messages on the corresponding client end right away.

This method requires the following rights on the current connection:

Errors are presented as an epitaph on the object_request channel.

  • error ZX_ERR_ACCESS_DENIED if the requested rights exceeds what is allowed.
  • error ZX_ERR_BAD_PATH if path is invalid.

Request

NameType
path Path
mode OpenMode
options ConnectionOptions
object_request handle<channel>

ReadDirents

Reads a collection of variably sized dirents into a buffer. The number of dirents in a directory may be very large: akin to calling read multiple times on a file, directories have a seek offset which is updated on subsequent calls to ReadDirents. Each call to ReadDirents will only return whole dirent structures, they will not get split across ReadDirent calls.

These dirents are of the form:

struct dirent {
  // Describes the inode of the entry.
  uint64 ino;
  // Describes the length of the dirent name in bytes.
  uint8 size;
  // Describes the type of the entry. Aligned with the
  // POSIX d_type values. Use `DIRENT_TYPE_*` constants.
  uint8 type;
  // Unterminated name of entry.
  char name[0];
}

This method does not require any rights, since one could always probe for directory contents by triggering name conflicts during file creation.

Request

NameType
max_bytes uint64

Response

NameType
s zx/status
dirents vector<uint8>[8192]

Rename2

Renames a node named src to the name dst, in a directory represented by dst_parent_token.

src and dst must be valid node names. See fuchsia.io2/Name for what constitutes a valid name.

This method requires the following rights on both the current connection, and the connection identified by dst_parent_token:

Request

NameType
src fuchsia.io2/Name
dst_parent_token fuchsia.io2/Token
dst fuchsia.io2/Name

Response

NameType
result Directory_Rename2_Result

Reopen

Creates another connection to the same node.

  • options options applicable to both Open and Reopen, including negotiating protocol and restricting rights. See fuchsia.io2/ConnectionOptions.
  • object_request is the server end of a channel created for the new connection. The caller may proceed to send messages on the corresponding client end right away.

For files, the cloned connection and the original connection have independent seek offsets.

Request

NameType
options ConnectionOptions
object_request handle<channel>

Rewind

Resets the directory seek offset.

This method does not require any rights, similar to ReadDirents.

Request

<EMPTY>

Response

NameType
s zx/status

SetAttr

Updates information about the node. flags may be any of NODE_ATTRIBUTE_FLAG_*.

This method requires following rights: OPEN_RIGHT_WRITABLE, otherwise returns ZX_ERR_BAD_HANDLE.

Request

NameType
flags uint32
attributes NodeAttributes

Response

NameType
s zx/status

Sync

Synchronizes updates to the node to the underlying media, if it exists.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
s zx/status

Sync2

Synchronizes updates to the node to the underlying media, if it exists.

This method will return when the filesystem server has flushed the relevant updates to the underlying media, but does not guarantee the underlying media has persisted the information, nor that any information is committed to hardware. Clients may use Sync to ensure ordering between operations.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
result Node_Sync2_Result

Removes a child node from the this directory's list of entries.

Note: this does not guarantee that the underlying object is destroyed. Although the link will be removed from the containing directory, objects with multiple references (such as files which are still open) will not actually be destroyed until all references are closed.

  • error ZX_ERR_ACCESS_DENIED if the connection does not have Rights.WRITE_BYTES.
  • error ZX_ERR_NOT_SUPPORTED if the underlying filesystem does not support writing.
  • error ZX_ERR_BAD_PATH if name is invalid.
  • error ZX_ERR_NOT_EMPTY if name refers to a non-empty directory.
  • error ZX_ERR_UNAVAILABLE if name refers to a mount point, containing a remote channel.
  • error ZX_ERR_NOT_DIR if the options requested a directory but something other than a directory was found.

Other errors may be returned for filesystem-specific reasons.

This method requires the following rights:

NameType
name fuchsia.io2/Name
options fuchsia.io2/UnlinkOptions
NameType
result Directory_Unlink_Result

UpdateAttributes

Updates information about the node.

  • attributes the presence of a table field in attributes indicates the intent to update the corresponding attribute.

This method requires the Rights.UPDATE_ATTRIBUTES right.

Request

NameType
attributes NodeAttributes2

Response

NameType
result Node_UpdateAttributes_Result

Watch

Watches a directory, receiving events of added messages on the watcher request channel.

The watcher handle will send messages of the form:

struct {
  uint8 event;
  uint8 len;
  char name[];
};

Where names are NOT null-terminated.

This API is unstable; in the future, watcher will be a DirectoryWatcher client.

Mask specifies a bitmask of events to observe. Options must be zero; it is reserved.

This method does not require any rights, similar to ReadDirents.

Request

NameType
mask uint32
options uint32
watcher handle<channel>

Response

NameType
s zx/status

DirectoryWatcher

Defined in fuchsia.io/directory.fidl

DirectoryWatcher transmits messages from a filesystem server about events happening in the filesystem. Clients can register new watchers using the Directory.Watch method, where they can filter which events they want to receive notifications for.

OnEvent

Request

NameType
events vector<uint8>[8192]

File

Defined in fuchsia.io/file.fidl

File defines the interface of a node which contains a flat layout of data.

AdvisoryLock

Acquires an advisory lock on the underlying file.

The lock lasts until either this connection is closed or this method is called with |AdvisoryLockType.UNLOCK| to release the lock explicitly.

Advisory locks are purely advisory. They do not prevent actual read or write operations from occurring on the file, either through this connection or through other connections.

This method requires the following rights:

Errors

  • ZX_ERR_BAD_STATE The specified type of lock cannot be acquired. For example, another connection might hold a conflicting lock type.
  • ZX_ERR_NOT_SUPPORTED This file does not support advisory locking.
  • ZX_ERR_ACCESS_DENIED This connection does not have sufficient rights to acquire the given type of lock.

Request

NameType
request fuchsia.io2/AdvisoryLockRequest

Response

NameType
result fuchsia.io2/AdvisoryLocking_AdvisoryLock_Result

Clone

Create another connection to the same remote object.

flags may be any of:

  • OPEN_RIGHT_*
  • OPEN_FLAG_APPEND
  • OPEN_FLAG_NO_REMOTE
  • OPEN_FLAG_DESCRIBE
  • CLONE_FLAG_SAME_RIGHTS

All other flags are ignored.

The OPEN_RIGHT_* bits in flags request corresponding rights over the resulting cloned object. The cloned object must have rights less than or equal to the original object, otherwise returns ZX_ERR_ACCESS_DENIED. Alternatively, pass CLONE_FLAG_SAME_RIGHTS to inherit the rights on the source connection. It is invalid to pass any of the OPEN_RIGHT_* flags together with CLONE_FLAG_SAME_RIGHTS.

Request

NameType
flags uint32
object request<Node>

Close

Terminates connection with object.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
s zx/status

Close2

Terminates connection with object.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
result Node_Close2_Result

Describe

Returns extra information about the type of the object. If the Describe operation fails, the connection is closed.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
info NodeInfo

Describe2

Returns extra connection information and auxiliary handles.

  • query specifies the fields in ConnectionInfo that the caller is interested in.

When all known bits in query are set, the return value matches the one from OnConnectionInfo, as if the caller requested that event using ConnectionFlags.GET_CONNECTION_INFO.

If the Describe operation fails, the connection is closed with the associated error.

This method does not require any rights.

Request

NameType
query ConnectionInfoQuery

Response

NameType
info ConnectionInfo

GetAttr

Acquires information about the node.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
s zx/status
attributes NodeAttributes

GetAttributes

Acquires information about the node.

The attributes of a node should be stable, independent of the specific protocol used to access it.

  • query a bit-mask specifying which attributes to fetch. The server should not return more than necessary.
  • attributes the returned attributes.

This method requires the Rights.GET_ATTRIBUTES right.

Request

NameType
query NodeAttributesQuery

Response

NameType
result Node_GetAttributes_Result

GetBackingMemory

Acquires a zx.handle:VMO representing this file, if there is one, with the requested access rights.

  • request flags a VmoFlags indicating the desired mode of access.
  • error a zx.status value indicating the failure.

This method requires the following rights:

Request

NameType
flags VmoFlags

Response

NameType
result File_GetBackingMemory_Result

GetBuffer

Acquires a buffer representing this file, if there is one, with the requested access rights.

flags may be any of VMO_FLAG_*.

This method requires following rights:

  • OPEN_RIGHT_WRITABLE if flags includes VMO_FLAG_WRITE.
  • OPEN_RIGHT_READABLE if flags includes VMO_FLAG_READ or VMO_FLAG_EXEC.
  • OPEN_RIGHT_EXECUTABLE if flags includes VMO_FLAG_EXEC.

Request

NameType
flags uint32

Response

NameType
s zx/status
buffer fuchsia.mem/Buffer?

GetFlags

Acquires the Directory.Open rights and flags used to access this file.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
s zx/status
flags uint32

IoToIo2Placeholder

This message should never be sent or received.

This declaration exists to let keep the Rust bindings compiling as we add and remove transitional elements from the fuchsia.io protocols. Without this declaration, the users of the Rust bindings fail to compile when there aren't any transitional protocol elements.

DEPRECATED

Request

<EMPTY>

NodeGetFlags

Acquires the Directory.Open rights and flags used to access this file.

This method does not require any rights. This method has the same functionality as GetFlags for File and is meant as an in-progress replacement.

Request

<EMPTY>

Response

NameType
s zx/status
flags uint32

NodeSetFlags

Changes the Directory.Open flags used to access the file. Supported flags which can be turned on / off:

  • OPEN_FLAG_APPEND

This method does not require any rights. This method has the same functionality as SetFlags for File and is meant as an in-progress replacement.

Request

NameType
flags uint32

Response

NameType
s zx/status

OnConnectionInfo

An event produced eagerly by the server if requested by ConnectionFlags.GET_CONNECTION_INFO. This event will be the first message from the server, and is sent exactly once.

Different from fuchsia.io/OnOpen, an error during open/reopen is always manifested as an epitaph.

Response

NameType
info ConnectionInfo

OnOpen

An event produced eagerly by a FIDL server if requested by OPEN_FLAG_DESCRIBE.

Indicates the success or failure of the open operation, and optionally describes the object. If the status is ZX_OK, info contains descriptive information about the object (the same as would be returned by Describe).

Response

NameType
s zx/status
info NodeInfo?

Read

Reads up to count bytes at the seek offset. The seek offset is moved forward by the number of bytes read.

This method requires the following rights: OPEN_RIGHT_READABLE, otherwise returns ZX_ERR_BAD_HANDLE.

Returns ZX_ERR_OUT_OF_RANGE if count is greater than MAX_BUF.

Request

NameType
count uint64

Response

NameType
s zx/status
data vector<uint8>[8192]

Read2

Reads up to 'count' bytes at the seek offset. The seek offset is moved forward by the number of bytes read.

Invariants

  • The returned data.length will never be greater than count.
  • If data.length is less than count, it means that the seek offset has reached the end of file as part of this operation.
  • If data.length is zero while count is not, it means that the seek offset is already at or beyond the end of file, and no data could be read.
  • If count is zero, the server should perform all the checks ensuring read access without actually read anything, and return an empty data vector.

This method requires the Rights.READ_BYTES right.

Returns ZX_ERR_OUT_OF_RANGE if count is greater than MAX_TRANSFER_SIZE.

Request

NameType
count uint64

Response

NameType
result File_Read2_Result

ReadAt

Reads up to count bytes at the provided offset. Does not affect the seek offset.

This method requires the following rights: OPEN_RIGHT_READABLE, otherwise returns ZX_ERR_BAD_HANDLE.

Returns ZX_ERR_OUT_OF_RANGE if count is greater than MAX_BUF.

Request

NameType
count uint64
offset uint64

Response

NameType
s zx/status
data vector<uint8>[8192]

ReadAt2

Reads up to 'count' bytes at the provided offset. Does not affect the seek offset.

Invariants

  • The returned data.length will never be greater than count.
  • If data.length is less than count, it means that ReadAt has hit the end of file as part of this operation.
  • If data.length is zero while count is not, it means that offset is at or past the end of file, and no data can be read.
  • If count is zero, the server should perform all the checks ensuring read access without actually reading anything, and return an empty data vector.

This method requires the Rights.READ_BYTES right.

Returns ZX_ERR_OUT_OF_RANGE if count is greater than MAX_TRANSFER_SIZE.

Request

NameType
count uint64
offset uint64

Response

NameType
result File_ReadAt2_Result

Reopen

Creates another connection to the same node.

  • options options applicable to both Open and Reopen, including negotiating protocol and restricting rights. See fuchsia.io2/ConnectionOptions.
  • object_request is the server end of a channel created for the new connection. The caller may proceed to send messages on the corresponding client end right away.

For files, the cloned connection and the original connection have independent seek offsets.

Request

NameType
options ConnectionOptions
object_request handle<channel>

Resize

Shrinks or grows the file size to 'length' bytes.

If file size is reduced by this operation, the extra trailing data' is discarded. If file size is increased by this operation, the extended area appears as if it was zeroed.

This method requires the Rights.WRITE_BYTES right.

Request

NameType
length uint64

Response

NameType
result File_Resize_Result

Seek

Moves the offset at which the next invocation of Read() or Write() will occur.

This method does not require any rights.

Request

NameType
offset int64
start SeekOrigin

Response

NameType
s zx/status
offset uint64

Seek2

Moves the offset at which the next invocation of Read or Write will occur. The seek offset is specific to each file connection.

  • request origin the reference point where offset will be based on.
  • request offset the number of bytes to seek.
  • response offset_from_start the adjusted seek offset, from the start of the file.

This method does not require any rights.

Request

NameType
origin SeekOrigin
offset int64

Response

NameType
result File_Seek2_Result

SetAttr

Updates information about the node. flags may be any of NODE_ATTRIBUTE_FLAG_*.

This method requires following rights: OPEN_RIGHT_WRITABLE, otherwise returns ZX_ERR_BAD_HANDLE.

Request

NameType
flags uint32
attributes NodeAttributes

Response

NameType
s zx/status

SetFlags

Changes the Directory.Open flags used to access the file. Supported flags which can be turned on / off:

  • OPEN_FLAG_APPEND

This method does not require any rights.

Request

NameType
flags uint32

Response

NameType
s zx/status

Sync

Synchronizes updates to the node to the underlying media, if it exists.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
s zx/status

Sync2

Synchronizes updates to the node to the underlying media, if it exists.

This method will return when the filesystem server has flushed the relevant updates to the underlying media, but does not guarantee the underlying media has persisted the information, nor that any information is committed to hardware. Clients may use Sync to ensure ordering between operations.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
result Node_Sync2_Result

Truncate

Shrinks the file size to 'length' bytes.

This method requires following rights: OPEN_RIGHT_WRITABLE, otherwise returns ZX_ERR_BAD_HANDLE.

Request

NameType
length uint64

Response

NameType
s zx/status

UpdateAttributes

Updates information about the node.

  • attributes the presence of a table field in attributes indicates the intent to update the corresponding attribute.

This method requires the Rights.UPDATE_ATTRIBUTES right.

Request

NameType
attributes NodeAttributes2

Response

NameType
result Node_UpdateAttributes_Result

Write

Writes data at the seek offset. The seek offset is moved forward by the number of bytes written.

This method requires following rights: OPEN_RIGHT_WRITABLE, otherwise returns ZX_ERR_BAD_HANDLE.

Request

NameType
data vector<uint8>[8192]

Response

NameType
s zx/status
actual uint64

Write2

Writes data at the seek offset. The seek offset is moved forward by the number of bytes written. If the file is in append mode, the seek offset is first set to the end of the file, followed by the write, in one atomic step.

The file size may grow if the seek offset plus data.length is beyond the current end of file.

  • request data the byte buffer to write to the file.
  • response actual_count the number of bytes written.

Invariants

  • The returned actual_count will never be greater than data.length.
  • If the server is unable to write all the data due to e.g. not enough space, actual_count may be less than data.length.
  • If data.length is zero, the server should perform all the checks ensuring write access without mutating the file. The seek offset is still updated if in append mode.

This method requires the Rights.WRITE_BYTES right.

Request

NameType
data Transfer

Response

NameType
result File_Write2_Result

WriteAt

Writes data to the provided offset. Does not affect the seek offset.

This method requires following rights: OPEN_RIGHT_WRITABLE, otherwise returns ZX_ERR_BAD_HANDLE.

Request

NameType
data vector<uint8>[8192]
offset uint64

Response

NameType
s zx/status
actual uint64

WriteAt2

Writes data at the provided offset. Does not affect the seek offset.

The file size may grow if offset plus data.length is past the current end of file.

  • request data the byte buffer to write to the file.
  • request offset the offset from start of the file to begin writing.
  • response actual_count the number of bytes written.

Invariants

  • The returned actual_count will never be greater than data.length.
  • If the server is unable to write all the data due to e.g. not enough space, actual_count may be less than data.length.
  • If data.length is zero, the server should perform all the checks ensuring write access without mutating the file.

This method requires the Rights.WRITE_BYTES right.

Request

NameType
data Transfer
offset uint64

Response

NameType
result File_WriteAt2_Result

Node

Defined in fuchsia.io/node.fidl

Node defines the minimal interface for entities which can be accessed in a filesystem.

Clone

Create another connection to the same remote object.

flags may be any of:

  • OPEN_RIGHT_*
  • OPEN_FLAG_APPEND
  • OPEN_FLAG_NO_REMOTE
  • OPEN_FLAG_DESCRIBE
  • CLONE_FLAG_SAME_RIGHTS

All other flags are ignored.

The OPEN_RIGHT_* bits in flags request corresponding rights over the resulting cloned object. The cloned object must have rights less than or equal to the original object, otherwise returns ZX_ERR_ACCESS_DENIED. Alternatively, pass CLONE_FLAG_SAME_RIGHTS to inherit the rights on the source connection. It is invalid to pass any of the OPEN_RIGHT_* flags together with CLONE_FLAG_SAME_RIGHTS.

Request

NameType
flags uint32
object request<Node>

Close

Terminates connection with object.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
s zx/status

Close2

Terminates connection with object.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
result Node_Close2_Result

Describe

Returns extra information about the type of the object. If the Describe operation fails, the connection is closed.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
info NodeInfo

Describe2

Returns extra connection information and auxiliary handles.

  • query specifies the fields in ConnectionInfo that the caller is interested in.

When all known bits in query are set, the return value matches the one from OnConnectionInfo, as if the caller requested that event using ConnectionFlags.GET_CONNECTION_INFO.

If the Describe operation fails, the connection is closed with the associated error.

This method does not require any rights.

Request

NameType
query ConnectionInfoQuery

Response

NameType
info ConnectionInfo

GetAttr

Acquires information about the node.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
s zx/status
attributes NodeAttributes

GetAttributes

Acquires information about the node.

The attributes of a node should be stable, independent of the specific protocol used to access it.

  • query a bit-mask specifying which attributes to fetch. The server should not return more than necessary.
  • attributes the returned attributes.

This method requires the Rights.GET_ATTRIBUTES right.

Request

NameType
query NodeAttributesQuery

Response

NameType
result Node_GetAttributes_Result

IoToIo2Placeholder

This message should never be sent or received.

This declaration exists to let keep the Rust bindings compiling as we add and remove transitional elements from the fuchsia.io protocols. Without this declaration, the users of the Rust bindings fail to compile when there aren't any transitional protocol elements.

DEPRECATED

Request

<EMPTY>

NodeGetFlags

Acquires the Directory.Open rights and flags used to access this file.

This method does not require any rights. This method has the same functionality as GetFlags for File and is meant as an in-progress replacement.

Request

<EMPTY>

Response

NameType
s zx/status
flags uint32

NodeSetFlags

Changes the Directory.Open flags used to access the file. Supported flags which can be turned on / off:

  • OPEN_FLAG_APPEND

This method does not require any rights. This method has the same functionality as SetFlags for File and is meant as an in-progress replacement.

Request

NameType
flags uint32

Response

NameType
s zx/status

OnConnectionInfo

An event produced eagerly by the server if requested by ConnectionFlags.GET_CONNECTION_INFO. This event will be the first message from the server, and is sent exactly once.

Different from fuchsia.io/OnOpen, an error during open/reopen is always manifested as an epitaph.

Response

NameType
info ConnectionInfo

OnOpen

An event produced eagerly by a FIDL server if requested by OPEN_FLAG_DESCRIBE.

Indicates the success or failure of the open operation, and optionally describes the object. If the status is ZX_OK, info contains descriptive information about the object (the same as would be returned by Describe).

Response

NameType
s zx/status
info NodeInfo?

Reopen

Creates another connection to the same node.

  • options options applicable to both Open and Reopen, including negotiating protocol and restricting rights. See fuchsia.io2/ConnectionOptions.
  • object_request is the server end of a channel created for the new connection. The caller may proceed to send messages on the corresponding client end right away.

For files, the cloned connection and the original connection have independent seek offsets.

Request

NameType
options ConnectionOptions
object_request handle<channel>

SetAttr

Updates information about the node. flags may be any of NODE_ATTRIBUTE_FLAG_*.

This method requires following rights: OPEN_RIGHT_WRITABLE, otherwise returns ZX_ERR_BAD_HANDLE.

Request

NameType
flags uint32
attributes NodeAttributes

Response

NameType
s zx/status

Sync

Synchronizes updates to the node to the underlying media, if it exists.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
s zx/status

Sync2

Synchronizes updates to the node to the underlying media, if it exists.

This method will return when the filesystem server has flushed the relevant updates to the underlying media, but does not guarantee the underlying media has persisted the information, nor that any information is committed to hardware. Clients may use Sync to ensure ordering between operations.

This method does not require any rights.

Request

<EMPTY>

Response

NameType
result Node_Sync2_Result

UpdateAttributes

Updates information about the node.

  • attributes the presence of a table field in attributes indicates the intent to update the corresponding attribute.

This method requires the Rights.UPDATE_ATTRIBUTES right.

Request

NameType
attributes NodeAttributes2

Response

NameType
result Node_UpdateAttributes_Result

STRUCTS

DatagramSocket resource

Defined in fuchsia.io/node.fidl

FieldTypeDescriptionDefault
event handle<eventpair>

See fuchsia.posix.socket.DatagramSocket for details.

No default

Device resource

Defined in fuchsia.io/node.fidl

FieldTypeDescriptionDefault
event handle<eventpair>?

An optional event which transmits information about a device's state.

The "DEVICE_SIGNAL_" values may be observed on this event.

No default

DirectoryObject

Defined in fuchsia.io/node.fidl

<EMPTY>

Directory_Rename2_Response

Defined in fuchsia.io/directory.fidl

<EMPTY>

Defined in fuchsia.io/directory.fidl

<EMPTY>

FileObject resource

Defined in fuchsia.io/node.fidl

FieldTypeDescriptionDefault
event handle<event>?

An optional event which transmits information about an object's readability or writability. This event relays information about the underlying object, not the capability granted to client: this event may be signalled "readable" on a connection that does not have the capability to read.

The "FILE_SIGNAL_" values may be observed on this event.

No default
stream handle<stream>?

A placeholder for future stream support.

Currently, servers are required not to send a handle in this field.

No default

File_GetBackingMemory_Response resource

Defined in fuchsia.io/file.fidl

FieldTypeDescriptionDefault
vmo handle<vmo> No default

File_Read2_Response

Defined in fuchsia.io/file.fidl

FieldTypeDescriptionDefault
data Transfer No default

File_ReadAt2_Response

Defined in fuchsia.io/file.fidl

FieldTypeDescriptionDefault
data Transfer No default

File_Resize_Response

Defined in fuchsia.io/file.fidl

<EMPTY>

File_Seek2_Response

Defined in fuchsia.io/file.fidl

FieldTypeDescriptionDefault
offset_from_start uint64 No default

File_Write2_Response

Defined in fuchsia.io/file.fidl

FieldTypeDescriptionDefault
actual_count uint64 No default

File_WriteAt2_Response

Defined in fuchsia.io/file.fidl

FieldTypeDescriptionDefault
actual_count uint64 No default

NodeAttributes

Defined in fuchsia.io/node.fidl

NodeAttributes defines generic information about a filesystem node.

FieldTypeDescriptionDefault
mode uint32

Protection bits and node type information describe in 'mode'.

No default
id uint64

A filesystem-unique ID.

No default
content_size uint64

Node size, in bytes.

No default
storage_size uint64

Space needed to store node (possibly larger than size), in bytes.

No default
creation_time uint64

Time of creation (may be updated manually after creation) in ns since Unix epoch, UTC.

No default
modification_time uint64

Time of last modification in ns since Unix epoch, UTC.

No default

Node_Close2_Response

Defined in fuchsia.io/node.fidl

<EMPTY>

Node_GetAttributes_Response

Defined in fuchsia.io/node.fidl

FieldTypeDescriptionDefault
attributes NodeAttributes2 No default

Node_Sync2_Response

Defined in fuchsia.io/node.fidl

<EMPTY>

Node_UpdateAttributes_Response

Defined in fuchsia.io/node.fidl

<EMPTY>

Pipe resource

Defined in fuchsia.io/node.fidl

FieldTypeDescriptionDefault
socket handle<socket> No default

RawSocket resource

Defined in fuchsia.io/node.fidl

FieldTypeDescriptionDefault
event handle<eventpair>

See fuchsia.posix.socket.raw.Socket for details.

No default

RightsRequest

Defined in fuchsia.io/connection-options.fidl

Options for requesting rights on the new connection. Because opening a new connection may involve multiple hops through directory proxies, we require the client to set an upper bound and lower bound on the rights request, and intermediate proxies to refine these bounds.

The rights manipulation should be implemented mechanically without knowledge of any specific rights, and servers should propagate unknown bits members, to gracefully handle future rights extensions.

Implementation Notes

It could be common for a client to request an exact set of rights. We recommend client libraries to define a helper function like follows:

fn Exact(exact_rights: Rights) -> RightsRequest {
    RightsRequest {
        at_most: exact_rights,
        at_least: exact_rights,
        resolution: RightsResolution.MAXIMIZE,
    }
}
FieldTypeDescriptionDefault
at_most Rights

Sets an upper bound on the resulting rights. The exact rights will depend on resolution.

Implementation Notes

When a directory proxy encounters this variant, it should compute the intersection between this and the rights on the connection where it received the request, to shrink the rights.

  • If the intersection is empty, or not a superset of at_least, the proxy should close object_request with the ZX_ERR_ACCESS_DENIED epitaph.
  • Otherwise, the proxy should forward the Open call as usual, but update at_most with the shrunk rights.
No default
at_least Rights

Sets a lower bound on the resulting rights. The exact rights will depend on resolution.

  • During Directory.Open, you may only specify the same rights as what the directory connection already has, or a subset of those.
  • During Node.Reopen, similarly, you may only specify the same or a subset of rights possessed by the original connection.
  • Exceeding those rights causes object_request to be closed with a ZX_ERR_ACCESS_DENIED epitaph.

Therefore there are these invariants which should be maintained:

at_most ⊋ {}
at_most ⊃ at_least
rights_on_connection_where_open_is_received ⊋ {}
rights_on_connection_where_open_is_received ⊃ at_least

using the superset (), proper superset (), and empty set ({}) notations.

No default
resolution RightsResolution

Controls how the rights on the new connection are computed from at_most and at_least. See fuchsia.io2/RightsResolution.

No default

Service

Defined in fuchsia.io/node.fidl

<EMPTY>

StreamSocket resource

Defined in fuchsia.io/node.fidl

FieldTypeDescriptionDefault
socket handle<socket> No default

Tty resource

Defined in fuchsia.io/node.fidl

FieldTypeDescriptionDefault
event handle<eventpair>? No default

Vmofile resource

Defined in fuchsia.io/node.fidl

FieldTypeDescriptionDefault
vmo handle<vmo>

The VMO which backs this file.

No default
offset uint64

The index into vmo which represents the first byte of the file.

No default
length uint64

The number of bytes, starting at offset, which may be used to represent this file.

No default

WatchedEvent

Defined in fuchsia.io/directory.fidl

WatchedEvent describes events returned from a DirectoryWatcher.

FieldTypeDescriptionDefault
event uint8 No default
len uint8 No default
name vector<uint8>[255] No default

ENUMS

OpenMode strict

Type: uint32

Defined in fuchsia.io/directory.fidl

Options related to node creation during Directory.Open.

NameValueDescription
OPEN_EXISTING 1

Only succeed if the object exists.

MAYBE_CREATE 2

Create the object if it does not exist, otherwise open existing. The check and the creation are performed in one atomic step.

ALWAYS_CREATE 3

Assert that the object does not exist, then create it. The assertion and creation are performed in one atomic step.

OPEN_MOUNT_POINT 268435456

If the object is a mount point, open the local directory instead of forwarding the request. The object must be a directory.

This option implies the behavior of OPEN_EXISTING.

DEPRECATED - Mount points will be replaced by components.

RightsResolution strict

Type: uint32

Defined in fuchsia.io/connection-options.fidl

When an Open/Reopen request reaches its final remote server, it should assign rights on the new connection based on one of these modes.

NameValueDescription
MAXIMIZE 1

The rights will be the intersection between RightsRequest.at_most and the connection where the Open/Reopen request was received, closing object_request with ZX_ERR_ACCESS_DENIED if it is empty.

POSIX 2

The rights will be determined by the following rules:

  • If the negotiated protocol on the new connection is fuchsia.io2/Directory, the rules from the MAXIMIZE case applies.
  • Otherwise, the rights will be RightsRequest.at_least if it does not exceed rights on the current connection.
  • Otherwise, object_request should be closed with ZX_ERR_ACCESS_DENIED.

The motivation for this enum is to facilitate implementing POSIX compatibility layers. The POSIX file permission model relies on ambient authority: access control on files are resolved based on the mode of the file, and the current user. There is no concept of hierarchical permissions. Fuchsia, on the other hand, restricts rights on file connections to never exceed that of its containing directory connection.

SeekOrigin strict

Type: uint32

Defined in fuchsia.io/file.fidl

The reference point for updating the seek offset. See File.Seek.

This enum matches the zx_stream_seek_origin_t enum.

NameValueDescription
START 0

Seek from the start of the file. The seek offset will be set to offset bytes. The seek offset cannot be negative in this case.

CURRENT 1

Seek from the current position in the file. The seek offset will be the current seek offset plus offset bytes.

END 2

Seek from the end of the file. The seek offset will be the file size plus offset bytes.

TABLES

ConnectionInfo resource

Defined in fuchsia.io/connection-info.fidl

Returns run-time information about a node that is specific to the current connection.

OrdinalFieldTypeDescription
1 representation Representation

The active variant corresponds to one of the supported protocols of the node, and represents the result of the connection-time negotiation. Provides auxiliary handles if applicable.

2 rights Rights

Information about the rights possessed by the current connection. Note: rights limits the set of operations allowed on the connection, but does not guarantee their availability. For example, one may have the Rights.EXECUTE right on a file connection, but the file itself does not have the EXECUTE ability, and hence cannot be executed. See ConnectionOptions.rights.

3 available_operations Operations

The set of available operations on this channel. It is always the intersection between the rights possessed by this connection, and the abilities of the node. The value may be zero in the case of an empty intersection. See ConnectionOptions.rights.

ConnectionOptions

Defined in fuchsia.io/connection-options.fidl

Options for Directory.Open and Node.Reopen.

OrdinalFieldTypeDescription
1 flags ConnectionFlags

Flags which can affect the behavior when opening and reopening. If absent, assumes a default of zero.

2 protocols NodeProtocols

Specifies the set of representations accepted by the client, to support a form of protocol negotiation on the node being opened. Refer to the definition of NodeProtocols for more details. It cannot be zero.

In addition, clients may assert the type of the object by setting the protocol corresponding to the expected type:

  • If the caller expected a directory but the node cannot be accessed as a directory, the error is ZX_ERR_NOT_DIR.
  • If the caller expected a file but the node cannot be accessed as a file, the error is ZX_ERR_NOT_FILE.
  • In other mismatched cases, the error is ZX_ERR_WRONG_TYPE.

During Directory.Open, if a new object is to be created, protocols determines the type of object to create; it must be present. If a valid object type cannot be unambiguously inferred e.g. both DIRECTORY and FILE were set, the request must fail.

During Node.Reopen, clients may specify a different but compatible protocols to do a "protocol upgrade".

If more than one protocol is present in protocols, the resultant protocol may become any one of them. Clients should specify ConnectionFlags.GET_CONNECTION_INFO to receive a Node.OnConnectionInfo event, in order to ascertain the protocol.

If absent, indicates that the caller accepts any type of node, and the resulting protocol is unspecified.

3 rights_request RightsRequest

Requests rights on the new connection according to the specified rules. See fuchsia.io2/RightsRequest.

Rights Hierarchy

Respecting principles of least privileges, rights in general must meet the following restrictions:

  • A connection must have nonzero rights.
  • From the perspective of a client, rights must never increase in a derived connection.
  • From the perspective of a directory proxy, it must ensure that new connections opened through it cannot have more rights than the connection where the proxy received the Open/Reopen call.

The proper enforcement of the rights hierarchy is a powerful refinement over the existing access control facilities offered by directory sandboxing.

Rights Inheritance

If rights_request is absent, inherits at most the rights on the source connection:

  • During Node.Reopen, the new connection would have the same rights as the connection where the Reopen call is made.
  • During Directory.Open, the rights on the connection would inherit from the connection where the Open call is made. If the path crosses intermediate proxies, a proxy may strip elements from the resulting rights if the intermediate connection does not have the corresponding rights.

Rights vs Abilities

The rights on a connection limits the set of operations allowed on that connection, but does not guarantee their availability, because the object may not support it. For convenience, clients may query the ConnectionInfo.available_operations field on a new connection, which is the intersection of the rights and abilities and indicates the guaranteed set of available operations.

See fuchsia.io2/Rights and fuchsia.io2/Abilities.

Implementation Notes

When a directory proxy encounters an absent rights field, let r be the rights on the connection where it received this request, the proxy should fill in this field with the following:

RightsRequest {
    at_most: r,
    at_least: 0,
    resolution: RightsResolution.MAXIMIZE,
}

before forwarding the request to the remote party.

ConnectorInfo resource

Defined in fuchsia.io/connection-info.fidl

Auxiliary data for the connector representation of a node, used for protocol discovery and connection.

It supports connecting to arbitrary protocols exported by the filesystem server at a path, including ones that do not compose fuchsia.io2/Node.

OrdinalFieldTypeDescription

DatagramSocketInfo resource

Defined in fuchsia.io/connection-info.fidl

The connection composes fuchsia.posix.socket/DatagramSocket.

OrdinalFieldTypeDescription
1 event handle<eventpair>

DebuglogInfo resource

Defined in fuchsia.io/connection-info.fidl

The debuglog representation of a node. The selection of this variant in Representation implies that the connection speaks the fuchsia.io2/Debuglog protocol.

OrdinalFieldTypeDescription
1 debuglog handle<debuglog>

The backing debuglog kernel object.

DeviceInfo resource

Defined in fuchsia.io/connection-info.fidl

The object may be cast to the shared interface of devices.

DEPRECATED - devices will be services in the future

OrdinalFieldTypeDescription
1 event handle<eventpair>

An optional event which transmits information about a device's state.

The DeviceSignal values may be observed on this event.

DirectoryInfo resource

Defined in fuchsia.io/connection-info.fidl

Auxiliary data for the directory representation of a node. The selection of this variant in Representation implies that the connection speaks the fuchsia.io2/Directory protocol.

OrdinalFieldTypeDescription

FileInfo resource

Defined in fuchsia.io/connection-info.fidl

Auxiliary data for the file representation of a node. The selection of this variant in Representation implies that the connection speaks the fuchsia.io2/File protocol.

OrdinalFieldTypeDescription
1 observer handle<event>

An optional event which transmits information about an object's readability or writability. This event relays information about the underlying object, not the capability granted to client: this event may be signalled "readable" on a connection that does not have the capability to read.

This event will be present if the following conditions are met:

  • The available_operations on the file connection is not empty.
  • The filesystem supports signalling readability/writability events.

The FileSignal values may be observed on this event.

2 is_append bool

Returns if the file is opened in append mode. In append mode, the seek offset is moved to the end before every write, the two steps performed in an atomic manner.

3 stream handle<stream>

An optional stream object, which can be used to read to and write from the file.

Reading and writing the file using the stream object can be up to 20x faster than reading and writing the file using the Read and Write operations in the fuchsia.io2/File protocol.

MemoryInfo resource

Defined in fuchsia.io/connection-info.fidl

Auxiliary data for the memory object representation of a node. The node is a file which is represented as a VMO. The selection of this variant in Representation implies that the connection speaks the fuchsia.io2/Memory protocol.

OrdinalFieldTypeDescription
1 buffer fuchsia.mem/Range

Although a VMO is returned as a part of this structure, that VMO may back multiple files. To identify the logical portion of the VMO that represents the single file, offset and size are also supplied.

If the range covers the entire VMO (i.e. the offset is zero and the length matches the size of the VMO), then all clients must receive a VMO with the same koid. This can be a duplicate of the same underlying page-aligned VMO.

The rights on this VMO should correspond to the rights on the node connection.

NodeAttributes2

Defined in fuchsia.io/node-attributes.fidl

Objective information about a filesystem node. See Node.GetAttributes and Node.UpdateAttributes.

The attributes of a node should be stable, independent of the specific protocol used to access it.

If a particular attribute is not applicable or not supported, filesystems should leave the corresponding field absent.

OrdinalFieldTypeDescription
1 protocols NodeProtocols

Describes the kinds of representations supported by the node. Note: This is not the result of the connection-time negotiation, which is conveyed via representation.

This attribute is read-only.

2 abilities Abilities

Describes the kinds of operations supported by the node. Note: This is distinct from the rights used at connection time.

This attribute is read-only.

3 content_size uint64

Node size, in bytes.

This attribute is read-only.

4 storage_size uint64

Space needed to store the node (possibly larger than size), in bytes.

This attribute is read-only.

6 creation_time uint64

Time of creation in nanoseconds since the Unix epoch, UTC. It may be updated manually after creation.

7 modification_time uint64

Time of last modification in nanoseconds since the Unix epoch, UTC.

8 id Id

An ID for the node. See fuchsia.io2/Id. This id should be unique among all entries of a directory.

This attribute is read-only.

PipeInfo resource

Defined in fuchsia.io/connection-info.fidl

The pipe representation of a node. A pipe is a data streaming interface, commonly used for standard in/out. There is no universal requirement as to if it is uni- or bi-directional. The selection of this variant in Representation implies that the connection speaks the fuchsia.io2/Pipe protocol.

OrdinalFieldTypeDescription
1 socket handle<socket>

The backing socket transport for the pipe. The rights on this socket should correspond to the rights on the node connection.

RawSocketInfo resource

Defined in fuchsia.io/connection-info.fidl

The connection composes fuchsia.posix.socket.raw/Socket.

OrdinalFieldTypeDescription
1 event handle<eventpair>

StreamSocketInfo resource

Defined in fuchsia.io/connection-info.fidl

The connection composes fuchsia.posix.socket/StreamSocket.

OrdinalFieldTypeDescription
1 socket handle<socket>

TtyInfo resource

Defined in fuchsia.io/connection-info.fidl

The object may be cast to a Tty interface.

DEPRECATED - tty functionalities may be covered by a tty service

OrdinalFieldTypeDescription
1 event handle<eventpair>

An optional event which transmits information about a device's state.

The DeviceSignal values may be observed on this event.

UNIONS

Directory_Rename2_Result strict

Defined in fuchsia.io/directory.fidl

Ordinal
VariantTypeDescription
1 response Directory_Rename2_Response
2 err zx/status

Defined in fuchsia.io/directory.fidl

Ordinal
VariantTypeDescription

File_GetBackingMemory_Result strict resource

Defined in fuchsia.io/file.fidl

Ordinal
VariantTypeDescription
1 response File_GetBackingMemory_Response
2 err zx/status

File_Read2_Result strict

Defined in fuchsia.io/file.fidl

Ordinal
VariantTypeDescription
1 response File_Read2_Response
2 err zx/status

File_ReadAt2_Result strict

Defined in fuchsia.io/file.fidl

Ordinal
VariantTypeDescription
1 response File_ReadAt2_Response
2 err zx/status

File_Resize_Result strict

Defined in fuchsia.io/file.fidl

Ordinal
VariantTypeDescription
1 response File_Resize_Response
2 err zx/status

File_Seek2_Result strict

Defined in fuchsia.io/file.fidl

Ordinal
VariantTypeDescription
1 response File_Seek2_Response
2 err zx/status

File_Write2_Result strict

Defined in fuchsia.io/file.fidl

Ordinal
VariantTypeDescription
1 response File_Write2_Response
2 err zx/status

File_WriteAt2_Result strict

Defined in fuchsia.io/file.fidl

Ordinal
VariantTypeDescription
1 response File_WriteAt2_Response
2 err zx/status

NodeInfo strict resource

Defined in fuchsia.io/node.fidl

Connection information.

Refer to Node.Describe and Node.OnOpen for usage.

Ordinal
VariantTypeDescription
1 service Service

No protocol information was supplied by the connection.

2 file FileObject

The connection composes File.

3 directory DirectoryObject

The connection composes Directory.

4 pipe Pipe
5 vmofile Vmofile

The connection composes File. Its implementation is backed by a VMO.

6 device Device
7 tty Tty
8
9 datagram_socket DatagramSocket

The connection composes fuchsia.posix.socket/DatagramSocket.

10 stream_socket StreamSocket

The connection composes fuchsia.posix.socket/StreamSocket.

11 raw_socket RawSocket

The connection composes fuchsia.posix.socket.raw/Socket.

Node_Close2_Result strict

Defined in fuchsia.io/node.fidl

Ordinal
VariantTypeDescription
1 response Node_Close2_Response
2 err zx/status

Node_GetAttributes_Result strict

Defined in fuchsia.io/node.fidl

Ordinal
VariantTypeDescription
1 response Node_GetAttributes_Response
2 err zx/status

Node_Sync2_Result strict

Defined in fuchsia.io/node.fidl

Ordinal
VariantTypeDescription
1 response Node_Sync2_Response
2 err zx/status

Node_UpdateAttributes_Result strict

Defined in fuchsia.io/node.fidl

Ordinal
VariantTypeDescription
1 response Node_UpdateAttributes_Response
2 err zx/status

Representation flexible resource

Defined in fuchsia.io/connection-info.fidl

Describes how the connection should be handled, and provides auxiliary handles and information for the connection where applicable. Refer to Node.Describe and Node.OnConnectionInfo.

If handles are returned which offer alternative ways of access to the node, the rights on the handles should correspond to the rights on the connection.

If the client specified more than one protocol in protocols during Directory.Open or Node.Reopen, the Representation xunion carries additionally the result of the connection-time negotiation via its tag.

The elements have one-to-one correspondence with the members of NodeProtocols.

Ordinal
VariantTypeDescription
1 connector ConnectorInfo

See NodeProtocols.CONNECTOR.

2 directory DirectoryInfo

See NodeProtocols.DIRECTORY.

3 file FileInfo

See NodeProtocols.FILE.

4 memory MemoryInfo

See NodeProtocols.MEMORY.

5 pipe PipeInfo

See NodeProtocols.PIPE.

6 device DeviceInfo

DEPRECATED - devices will be services in the future

7 tty TtyInfo

DEPRECATED - tty may not be useful

8 datagram_socket DatagramSocketInfo

See NodeProtocols.DATAGRAM_SOCKET.

9 stream_socket StreamSocketInfo

See NodeProtocols.STREAM_SOCKET.

10 raw_socket RawSocketInfo

See NodeProtocols.RAW_SOCKET.

BITS

ConnectionFlags strict

Type: uint64

Defined in fuchsia.io/connection-options.fidl

Flags applicable to both Directory.Open and Node.Reopen.

NameValueDescription
GET_CONNECTION_INFO 1

Requests that an Node.OnConnectionInfo event be sent as the first message on the protocol request. Requests all fields in the ConnectionInfo table. Doing so is more efficient than calling Node.Describe later on the connection.

CONNECT 2

Connects to the exposed protocol if the node is a Connector. It is an error to use this flag with other types of nodes.

If both GET_CONNECTION_INFO and CONNECT are specified, the channel will receive exactly one Node.OnConnectionInfo event, after which the protocol switches from fuchsia.io2/Node to the intended protocol. Message sent by the client prior to receiving Node.OnConnectionInfo are queued and processed after the protocol switch.

CONNECT cannot be supplied together with APPEND. CONNECT cannot be supplied together with TRUNCATE.

Requires the Rights.CONNECT right on the connection.

APPEND 4

Opens the node in append mode, i.e. the connection should seek to the end of the node before every write.

If the node does not support appending, it should result in a ZX_ERR_NOT_SUPPORTED epitaph. Currently, only fuchsia.io2/NodeProtocols.FILE connections may be configured for appending.

TRUNCATE 8

Truncates the object before usage, by setting its length to 0. Requires the Rights.WRITE_BYTES right on the connection.

If the node does not support truncating, it should result in a ZX_ERR_NOT_SUPPORTED epitaph.

ConnectionInfoQuery strict

Type: uint64

Defined in fuchsia.io/connection-info.fidl

Set the relevant bit to one to fetch the corresponding field during fuchsia.io2/Node.Describe.

NameValueDescription
REPRESENTATION 1

Requests ConnectionInfo.representation.

RIGHTS 2

Requests ConnectionInfo.rights.

AVAILABLE_OPERATIONS 4

Requests ConnectionInfo.available_operations.

NodeAttributesQuery strict

Type: uint64

Defined in fuchsia.io/node-attributes.fidl

When calling Node.GetAttributes, set the corresponding bit to one to query that particular attribute. The elements here correspond one-to-one with NodeAttributes.

NameValueDescription
PROTOCOLS 1

Requests NodeAttributes.protocols.

ABILITIES 2

Requests NodeAttributes.abilities.

CONTENT_SIZE 4

Requests NodeAttributes.content_size.

STORAGE_SIZE 8

Requests NodeAttributes.storage_size.

CREATION_TIME 32

Requests NodeAttributes.creation_time.

MODIFICATION_TIME 64

Requests NodeAttributes.modification_time.

ID 128

Requests NodeAttributes.id.

NodeProtocols strict

Type: uint64

Defined in fuchsia.io/connection-info.fidl

A node may have multiple supported representations when opening, even though it may have a fixed underlying identity.

Today, a file is accessed via the fuchsia.io2/File protocol, and sends a Representation.FileInfo when opened with GET_CONNECTION_INFO. However, in the future we might introduce a more sophisticated FileV2 protocol, or a more efficient SuperFastFile backed by a specialized kernel object. New clients can request the more advanced representations by specifying the corresponding bits in NodeProtocols, whereas existing clients would continue to talk to the node via the old representation.

NodeProtocols enables forward-compatibility through a form of protocol negotiation.

The elements have one-to-one correspondence with the members of Representation.

NameValueDescription
CONNECTOR 1

The connector representation of a node. The connection will speak either fuchsia.io2/Node, or some custom protocol, depending on the flags used during opening and reopening.

DIRECTORY 2

The directory representation of a node. The connection will speak the fuchsia.io2/Directory protocol.

FILE 4

The file representation of a node. The connection will speak the fuchsia.io2/File protocol.

MEMORY 8

The memory representation of a node. A memory object is a file whose contents are explicitly backed by some VMO. The connection will speak the fuchsia.io2/Memory protocol, and Representation would contain a fuchsia.mem/Range object representing the contents of the file.

PIPE 16

The pipe representation of a node. The connection will speak the fuchsia.io2/Pipe protocol.

DATAGRAM_SOCKET 32

The datagram socket representation of a node. The connection will speak the fuchsia.posix.socket/DatagramSocket protocol.

STREAM_SOCKET 64

The stream socket representation of a node. The connection will speak the fuchsia.posix.socket/StreamSocket protocol.

RAW_SOCKET 128

The raw socket representation of a node. The connection will speak the fuchsia.posix.socket.raw/Socket protocol.

DEVICE 268435456

DEPRECATED - devices will be services in the future

TTY 536870912

DEPRECATED - tty functionalities may be covered by a tty service

Operations strict

Type: uint64

Defined in fuchsia.io/rights-abilities.fidl

The common members definition behind Rights and Abilities. Note that Directory operations are distinct from File operations, with the exception of some common operations (e.g. GET_ATTRIBUTES) defined on the underlying fuchsia.io2/Node.

NameValueDescription
CONNECT 1

Connecting to a service.

READ_BYTES 2

Reading from the byte contents of a node.

WRITE_BYTES 4

Writing to the byte contents of a node.

EXECUTE 8

Execute the byte contents of a node.

GET_ATTRIBUTES 16

Reading the attributes of a node.

UPDATE_ATTRIBUTES 32

Updating the attributes of a node.

ENUMERATE 64

Reading the list of entries in a directory.

TRAVERSE 128

Opening a node from a directory.

When used in ConnectionOptions.rights, it must be specified together with Rights.ENUMERATE, since one can always probe the directory contents by opening children.

MODIFY_DIRECTORY 256

Modifying the list of entries in a directory. For example: node creation, renaming, linking, unlinking, etc.

When used in ConnectionOptions.rights, it must be specified together with Rights.ENUMERATE, since one can always probe the directory contents by triggering name conflicts during node creation.

ADMIN 72057594037927936

VmoFlags strict

Type: uint64

Defined in fuchsia.io/file.fidl

NameValueDescription
READ 1

Requests that the VMO be readable.

WRITE 2

Requests that the VMO be writable.

EXECUTE 4

Request that the VMO be executable.

PRIVATE_CLONE 65536

Require a copy-on-write clone of the underlying VMO. The request should fail if the VMO cannot be cloned. May not be supplied with SHARED_BUFFER.

SHARED_BUFFER 131072

Require an exact (non-cloned) handle to the underlying VMO. All clients using this flag would get a VMO with the same koid. The request should fail if a handle to the exact VMO cannot be returned. May not be supplied with PRIVATE_CLONE.

CONSTANTS

NameValueTypeDescription
CLONE_FLAG_SAME_RIGHTS 67108864 uint32

When used during clone, the new connection inherits the rights on the source connection, regardless if it is a file or directory. Otherwise, clone attempts to use the requested rights. It is invalid to pass any of the OPEN_RIGHT_* flags together with CLONE_FLAG_SAME_RIGHTS.

DEVICE_SIGNAL_ERROR 134217728 uint32

Indicates the device has encountered an error state.

DEVICE_SIGNAL_HANGUP 268435456 uint32

Indicates the device has hung up on the current connection.

DEVICE_SIGNAL_OOB 33554432 uint32

Indicates an out-of-band state transition has occurred.

DEVICE_SIGNAL_READABLE 16777216 uint32

Indicates the device is ready for reading.

DEVICE_SIGNAL_WRITABLE 67108864 uint32

Indicates the device is ready for writing.

DIRENT_TYPE_BLOCK_DEVICE 6 uint8

A dirent representing a block device object.

DIRENT_TYPE_DIRECTORY 4 uint8

A dirent representing a directory object.

DIRENT_TYPE_FILE 8 uint8

A dirent representing a file object.

DIRENT_TYPE_SERVICE 16 uint8

A dirent representing a service object.

DIRENT_TYPE_SOCKET 12 uint8

A dirent representing a socket object.

DIRENT_TYPE_UNKNOWN 0 uint8

A dirent with an unknown type.

FILE_SIGNAL_READABLE 16777216 uint32

Indicates the file is ready for reading.

FILE_SIGNAL_WRITABLE 33554432 uint32

Indicates the file is ready for writing.

INO_UNKNOWN 18446744073709551615 uint64

Nodes which do not have ino values should return this value from Readdir and GetAttr.

MAX_BUF 8192 uint64

The maximal buffer size which can be transmitted for buffered operations. This capacity is currently set somewhat arbitrarily.

MAX_FILENAME 255 uint64

The maximum length, in bytes, of a single filesystem component.

MAX_PATH 4096 uint64

The maximum length, in bytes, of a filesystem string.

MAX_PATH_LENGTH 4095 uint64

The maximum length, in bytes, of a filesystem path.

MAX_TRANSFER_SIZE 8192 uint64

The maximum I/O size that is allowed for read/write operations using byte vectors.

MODE_PROTECTION_MASK 4095 uint32

Bits reserved for posix protections. Native fuchsia filesystems are not required to set bits contained within MODE_PROTECTION_MASK, but filesystems that wish to do so may refer to sys/stat.h for their definitions.

MODE_TYPE_BLOCK_DEVICE 24576 uint32
MODE_TYPE_DIRECTORY 16384 uint32
MODE_TYPE_FILE 32768 uint32
MODE_TYPE_MASK 1044480 uint32

Bits indicating node type. The canonical mechanism to check for a node type is to take 'mode', bitwise AND it with the MODE_TYPE_MASK, and check exact equality against a mode type.

MODE_TYPE_SERVICE 65536 uint32
MODE_TYPE_SOCKET 49152 uint32
NODE_ATTRIBUTE_FLAG_CREATION_TIME 1 uint32

The fields of 'attributes' which are used to update the Node are indicated by the 'flags' argument.

NODE_ATTRIBUTE_FLAG_MODIFICATION_TIME 2 uint32
OPEN_FLAGS_ALLOWED_WITH_NODE_REFERENCE 46661632 uint32

Binary OR of OPEN_FLAG_DIRECTORY, OPEN_FLAG_NOT_DIRECTORY, OPEN_FLAG_DESCRIBE, and OPEN_FLAG_NODE_REFERENCE. Flags used when opening a node reference must fall within this mask.

OPEN_FLAG_APPEND 1048576 uint32

Seek to the end of the object before all writes.

OPEN_FLAG_CREATE 65536 uint32

Create the object if it doesn't exist.

OPEN_FLAG_CREATE_IF_ABSENT 131072 uint32

(with Create) Fail if the object already exists.

OPEN_FLAG_DESCRIBE 8388608 uint32

Requests that an "OnOpen" event is sent to the interface request. The event will contain a non-null NodeInfo if the open/clone is successful.

OPEN_FLAG_DIRECTORY 524288 uint32

Assert that the object to be opened is a directory. Return an error if the target object is not a directory.

OPEN_FLAG_NODE_REFERENCE 4194304 uint32

Open a reference to the object, not the object itself. It is ONLY valid to pass the following flags together with OPEN_FLAG_NODE_REFERENCE:

  • OPEN_FLAG_DIRECTORY
  • OPEN_FLAG_NOT_DIRECTORY
  • OPEN_FLAG_DESCRIBE otherwise an error is returned. If an object is opened or cloned using this method, the resulting connection does not carry any permission flags. The resulting node allows a limited set of operations: GetAttr, Clone, Close, Describe, and, if the node is a file, these extra operations: GetFlags, SetFlags.
OPEN_FLAG_NOT_DIRECTORY 33554432 uint32

Assert that the object to be opened is not a directory. Return an error if the target object is a directory.

OPEN_FLAG_NO_REMOTE 2097152 uint32

If the object is a mount point, open the local directory.

OPEN_FLAG_POSIX 16777216 uint32

Specify this flag to request POSIX-compatibility with respect to execute and write permissions. This flag implies OPEN_FLAG_POSIX_WRITABLE and OPEN_FLAG_POSIX_EXECUTABLE.

Use of this flag is being deprecated, and should be replaced with a combination of OPEN_FLAG_POSIX_WRITABLE and/or OPEN_FLAG_POSIX_EXECUTABLE.

OPEN_FLAG_POSIX_EXECUTABLE 268435456 uint32

Specify this flag to request POSIX-compatibility with respect to execute permission handling. Currently, it affects permission handling specifically during Open:

  • If the target path is a directory, the rights on the new connection expand to include OPEN_RIGHT_EXECUTABLE if and only if the current connection and all intermediate mount points are executable.
  • Otherwise, this flag is ignored. It is an access denied error to request more rights than those on the current connection, or any intermediate mount points.

If this flag is omitted, opening always uses the requested rights, failing the operation with access denied error if requested rights exceeds the rights attached to the current connection.

If the requesting connection is read-only and the requested rights are read-only, the flag may be ignored by the server, and is not forwarded downstream. This is an implementation detail, necessary to enforce hierarchical permissions across mount points, and should have no effect on the expected behavior for clients.

OPEN_FLAG_POSIX_WRITABLE 134217728 uint32

Specify this flag to request POSIX-compatibility with respect to write permission handling. Currently, it affects permission handling specifically during Open:

  • If the target path is a directory, the rights on the new connection expand to include OPEN_RIGHT_WRITABLE if and only if the current connection and all intermediate mount points are writable.
  • Otherwise, this flag is ignored. It is an access denied error to request more rights than those on the current connection, or any intermediate mount points.

If this flag is omitted, opening always uses the requested rights, failing the operation with access denied error if requested rights exceeds the rights attached to the current connection.

If the requesting connection is read-only and the requested rights are read-only, the flag may be ignored by the server, and is not forwarded downstream. This is an implementation detail, necessary to enforce hierarchical permissions across mount points, and should have no effect on the expected behavior for clients.

OPEN_FLAG_TRUNCATE 262144 uint32

Truncate the object before usage.

OPEN_RIGHT_ADMIN 4 uint32

Connection can mount/umount filesystem.

OPEN_RIGHT_EXECUTABLE 8 uint32

Connection can map target object executable.

OPEN_RIGHT_READABLE 1 uint32

Can read from target object.

OPEN_RIGHT_WRITABLE 2 uint32

Can write to target object.

RW_STAR_DIR

Alias for directory permission alias rw*

RX_STAR_DIR

Alias for directory permission alias rx*

R_STAR_DIR

Alias for directory permission alias r*

VMO_FLAG_EXACT 131072 uint32

Require an exact (non-cloned) handle to the underlying VMO. The request should fail if a handle to the exact VMO is not returned. May not be supplied with VMO_FLAG_PRIVATE.

VMO_FLAG_EXEC 4 uint32

Requests that the VMO be executable.

VMO_FLAG_PRIVATE 65536 uint32

Require a copy-on-write clone of the underlying VMO. The request should fail if the VMO is not cloned. May not be supplied with fuchsia_io_VMO_FLAG_EXACT.

VMO_FLAG_READ 1 uint32

Requests that the VMO be readable.

VMO_FLAG_WRITE 2 uint32

Requests that the VMO be writable.

WATCH_EVENT_ADDED 1 uint8

Indicates a node has been created (either new or moved) into a directory.

WATCH_EVENT_DELETED 0 uint8

Indicates the directory being watched has been deleted.

WATCH_EVENT_EXISTING 3 uint8

Identifies a node already existed in the directory when watching started.

WATCH_EVENT_IDLE 4 uint8

Identifies that no more WATCH_EVENT_EXISTING events will be sent.

WATCH_EVENT_REMOVED 2 uint8

Identifies a node has been removed (either deleted or moved) from the directory.

WATCH_MASK_ADDED 2 uint32

Used by Directory.Watch. Requests transmission of WATCH_EVENT_ADDED.

WATCH_MASK_ALL 31 uint32

Used by Directory.Watch. Requests transmission of all watcher events.

WATCH_MASK_DELETED 1 uint32

Used by Directory.Watch. Requests transmission of WATCH_EVENT_DELETED.

WATCH_MASK_EXISTING 8 uint32

Used by Directory.Watch. Requests transmission of WATCH_EVENT_EXISTING.

WATCH_MASK_IDLE 16 uint32

Used by Directory.Watch. Requests transmission of WATCH_EVENT_IDLE.

WATCH_MASK_REMOVED 4 uint32

Used by Directory.Watch. Requests transmission of WATCH_EVENT_REMOVED.

W_STAR_DIR

Alias for directory permission alias w*

X_STAR_DIR

Alias for directory permission alias x*

TYPE ALIASES

NameValueDescription
Abilities fuchsia.io/Operations

Abilities are properties intrinsic to a node. They specify which operations are supported by it.

Invoking an operation without corresponding support in the node results in a ZX_ERR_NOT_SUPPORTED error. Note that if both the access denied and the not supported error conditions apply, the access denied case takes precedence.

Id uint64

The type to identify a node, if the implementation supports some notion of unique node ID.

Uniqueness Guarantees

A client is usually presented with a directory tree that is the result of composing together multiple backing implementation instances. An ID would be unique within the corresponding instance only. Their boundaries are rather implicit on Fuchsia, as a result of transparently-forwarding directory proxies. It could be common for a client to observe identical Ids when traversing a directory tree, when it encounters nodes from different backing instances. Therefore, the ID is best used for debugging and informational purposes.

If the implementation also supports fuchsia.fs/Query, the fuchsia.fs/FilesystemInfo.fs_id field may be used to disambiguate IDs from different backing instances.

Path string[MAX_PATH_LENGTH]

A path is a string of one or more components, separated by "/". E.g. foo/bar/baz

Invariants

A valid path must meet the following criteria:

  • It cannot be empty.
  • It cannot be longer than MAX_PATH_LENGTH.
  • It cannot have a leading "/".
  • It cannot have a trailing "/".
  • Each component must be a valid Name.

Paths should be transformed into their canonical forms at client side. For example, a client should convert "foo/bar/.././baz/" to "foo/baz" before using it as a path.

Rights fuchsia.io/Operations

Rights are properties specific to a connection. They limit which operations are allowed on a connection.

Invoking an operation without the corresponding right results in a ZX_ERR_ACCESS_DENIED error.

Transfer vector[MAX_TRANSFER_SIZE]

The byte vector type used for read/write operations.