// 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.

package erofs

// This file contains definitions coming from the in-Kernel implementation of the EROFS filesystem.
// All definitions come from @linux//fs/erofs:erofs_fs.h unless stated otherwise.

// Magic contains the 4 magic bytes starting at position 1024 identifying an EROFS filesystem.
// Defined in @linux//include/uapi/linux/magic.h EROFS_SUPER_MAGIC_V1
var Magic = [4]byte{0xe2, 0xe1, 0xf5, 0xe0}

const blockSizeBits = 12
const BlockSize = 1 << blockSizeBits

// Defined in @linux//include/linux:fs_types.h starting at FT_UNKNOWN
const (
	fileTypeUnknown = iota
	fileTypeRegularFile
	fileTypeDirectory
	fileTypeCharacterDevice
	fileTypeBlockDevice
	fileTypeFIFO
	fileTypeSocket
	fileTypeSymbolicLink
)

// Anonymous enum starting at EROFS_INODE_FLAT_PLAIN
const (
	inodeFlatPlain             = 0
	inodeFlatCompressionLegacy = 1
	inodeFlatInline            = 2
	inodeFlatCompression       = 3
)

// struct erofs_dirent
type directoryEntryRaw struct {
	NodeNumber      uint64
	NameStartOffset uint16
	FileType        uint8
	Reserved        uint8
}

// struct erofs_super_block
type superblock struct {
	Magic                [4]byte
	Checksum             uint32
	FeatureCompat        uint32
	BlockSizeBits        uint8
	Reserved0            uint8
	RootNodeNumber       uint16
	TotalInodes          uint64
	BuildTimeSeconds     uint64
	BuildTimeNanoseconds uint32
	Blocks               uint32
	MetaStartAddr        uint32
	SharedXattrStartAddr uint32
	UUID                 [16]byte
	VolumeName           [16]byte
	FeaturesIncompatible uint32
	Reserved1            [44]byte
}

// struct erofs_inode_compact
type inodeCompact struct {
	Format         uint16
	XattrCount     uint16
	Mode           uint16
	HardlinkCount  uint16
	Size           uint32
	Reserved0      uint32
	Union          uint32
	InodeNumCompat uint32
	UID            uint16
	GID            uint16
	Reserved1      uint32
}

// Anonymous enum starting at Z_EROFS_VLE_CLUSTER_TYPE_PLAIN
const (
	vleClusterTypePlain = iota << 12
	vleClusterTypeHead
	vleClusterTypeNonhead
)
