// Copyright 2020 The Monogon Project Authors.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package osbase.node.build.fsspec;
option go_package = "source.monogon.dev/osbase/build/fsspec";

// FSSpec is the spec from which a filesystem is generated. It consists of files, directories and symbolic
// links. Directories are also automatically inferred when required for the placement of files or symbolic
// links. Inferred directories always have uid 0, gid 0 and permissions 0555. This can be overridden by
// explicitly specifying a directory at a given path.
message FSSpec {
  repeated File file = 1;
  repeated Directory directory = 2;
  repeated SymbolicLink symbolic_link = 3;
  repeated SpecialFile special_file = 4;
}

// For internal use only. Represents all supported inodes in a oneof.
message Inode {
  oneof type {
    File file = 1;
    Directory directory = 2;
    SymbolicLink symbolic_link = 3;
    SpecialFile special_file = 4;
  }
}

message File {
  // The path where the file ends up in the filesystem.
  string path = 1;
  // The path on the host filesystem where the file contents should be taken from.
  string source_path = 2;
  // Unix permission bits
  uint32 mode = 3;
  // Owner uid
  uint32 uid = 4;
  // Owner gid
  uint32 gid = 5;
}

message Directory {
  // The path where the directory ends up in the filesystem.
  string path = 1;
  // Unix permission bits
  uint32 mode = 2;
  // Owner uid
  uint32 uid = 3;
  // Owner gid
  uint32 gid = 4;
}

message SymbolicLink {
  // The path where the symbolic link ends up in the filesystem.
  string path = 1;
  // The path to which the symbolic link resolves to.
  string target_path = 2;
}

message SpecialFile {
  // The path where the special file ends up in the filesystem.
  string path = 1;

  enum Type {
    CHARACTER_DEV = 0;
    BLOCK_DEV = 1;
    FIFO = 2;
  }

  // Type of special file.
  Type type = 2;

  // The major device number of the special file.
  uint32 major = 3;
  // The minor number of the special file. Ignored for FIFO-type special files.
  uint32 minor = 4;

  // Unix permission bits
  uint32 mode = 5;
  // Owner uid
  uint32 uid = 6;
  // Owner gid
  uint32 gid = 7;
}