// 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 fuchsia.storage.ext4;

using fuchsia.io;
using fuchsia.mem;
using zx;

enum OutOfBoundsDirection {
    BELOW = 1;
    ABOVE = 2;
};

struct Success {
};

struct InvalidSuperBlock {
    /// Byte position in filesystem image.
    uint64 position;
};

struct InvalidSuperBlockMagic {
    /// Magic number.
    uint16 value;
};

struct BlockNumberOutOfBounds {
    /// Block number.
    uint64 block_number;
};

struct BlockSizeInvalid {
    /// Block size.
    uint32 block_size;
};

struct InvalidBlockGroupDesc {
    /// Byte position in filesystem image.
    uint64 position;
};

struct InvalidINode {
    /// INode number.
    uint32 inode_number;
};

struct InvalidExtentHeader {
    // This will fill in in a followup change.
};

struct InvalidExtentHeaderMagic {
    /// Magic number.
    uint16 value;
};

struct InvalidExtent {
    /// Byte position in filesystem image.
    uint64 position;
};

struct ExtentUnexpectedLength {
    /// Size received.
    uint64 size;
    /// Size expected.
    uint64 expected;
};

struct InvalidDirEntry2 {
    /// Byte position in filesystem image.
    uint64 position;
};

struct DirEntry2NonUtf8 {
    /// Data that was unable to be converted into UTF-8.
    /// Limiting to 255 to match with the max filename length.
    vector<uint8>:255 data;
};

struct InvalidInputPath {
    /// Not implemented. Will be empty string.
    string:1024 path;
};

struct PathNotFound {
    /// Path given.
    string:1024 path;
};

/// Directory entry has bad type value.
struct BadEntryType {
    /// Type value.
    uint8 value;
};

/// Feature Incompatible flag has banned flags.
struct BannedFeatureIncompat {
    /// Bitwise flags that are banned.
    uint32 value;
};

/// Feature Incompatible flag has missing flags.
struct RequiredFeatureIncompat {
    /// Bitwise flags that are missing.
    uint32 value;
};

struct Incompatible {
    /// Message stating what is wrong.
    string:1024 msg;
};

struct BadFile {
    /// Path of file.
    string:1024 path;
};

struct BadDirectory {
    /// Path of directory.
    string:1024 path;
};

struct ReaderReadError {
    /// Byte position in filesystem image.
    uint64 position;
};

/// Use `InvalidAddress` instead.
[Deprecated]
struct ReaderOutOfBounds {
    /// Byte position in filesystem image.
    uint64 position;
    /// Size of image.
    uint64 size;
};

struct InvalidAddress {
    /// Byte position in filesystem image.
    uint64 position;
    /// Direction of out of bounds.
    OutOfBoundsDirection direction;
    /// Boundary that was exceeded.
    uint64 bound;
};

/// Sub-result of an [`Ext4Server.MountVmo`] call denoting the actual error
/// that occurred in the reader.
flexible union ParseError {
    // Failures during the initial parsing of the image start below.
    // See ext4_read_only::structs::ParsingError for more info.
    1: InvalidSuperBlock invalid_super_block;
    2: InvalidSuperBlockMagic invalid_super_block_magic;
    3: BlockNumberOutOfBounds block_number_out_of_bounds;
    4: BlockSizeInvalid block_size_invalid;
    5: InvalidBlockGroupDesc invalid_block_group_desc;
    6: InvalidINode invalid_inode;
    7: InvalidExtentHeader invalid_extent_header;
    8: InvalidExtentHeaderMagic invalid_extent_header_magic;
    9: InvalidExtent invalid_extent;
    10: ExtentUnexpectedLength extent_unexpected_length;
    11: InvalidDirEntry2 invalid_dir_entry_2;
    12: DirEntry2NonUtf8 dir_entry_2_non_utf8;
    13: InvalidInputPath invalid_input_path;
    14: PathNotFound path_not_found;
    15: BadEntryType bad_entry_type;
    16: Incompatible incompatible;
    17: BadFile bad_file;
    18: BadDirectory bad_directory;
    19: ReaderReadError reader_read_error;
    [Deprecated]
    20: ReaderOutOfBounds reader_out_of_bounds;
    21: RequiredFeatureIncompat required_feature_incompat;
    22: BannedFeatureIncompat banned_feature_incompat;
    23: InvalidAddress invalid_address;
};

/// Result of an [`Ext4Server.MountVmo`] call.
flexible union MountVmoResult {
    // Note: It would be better to declare `MountVmo` with a result type of
    // `() error MountVmoError`, but FIDL currently does not support error
    // types that are not integers or enums of integers.  And it is nice to be
    // able to report richer error information than just an error code.

    /// The server has managed to read the image far enough to load the
    /// root directory and none of the early validation checks have failed.
    1: Success success;

    /// Error reading the VMO.
    2: zx.status vmo_read_failure;

    3: ParseError parse_error;
};

[Discoverable]
protocol Server {
    /// Read the VMO content as an Ext4 image and return a channel to the
    /// root of the mounted file system.
    ///
    /// + request `source` is an Ext4 image to be served over the `root`
    ///            connection.
    /// + request `flags` is the same flags you can pass to
    ///            [`fuchsia.io/Directory.Open`] call.  In particular
    ///            [`OPEN_FLAG_DESCRIBE`] can be used to report mount errors.
    ///            Note that [`MountVmoError`] will contain a better
    ///            description of any error that may occur at the mount
    ///            time.
    /// + request `root` is the server end of a connection that will be
    ///            serving the root of the mounted image.
    /// - result `result` In case we could parse the image far enough to
    ///           read the root directory [`MountVmoResult.success`] will be
    ///           returned.  Note that you may pipeline requests to the
    ///           `root` connection even before received a response.  In
    ///           case of an error one of the other values will be returned
    ///           and the `root` connection will be closed.
    MountVmo(
        fuchsia.mem.Buffer source,
        uint32 flags,
        request<fuchsia.io.Directory> root
        ) -> (MountVmoResult result);
};

service Service {
    /// An Ext4 server that can parse a file system image and present it
    /// using fuchsia-io FIDL API.
    Server server;
};
