1/*
2 * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef CHECK_SUM_FS_H
6#define CHECK_SUM_FS_H
7
8
9#include <OS.h>
10
11
12#define CHECK_SUM_FS_PRETTY_NAME	"CheckSum File System"
13
14
15static const uint64 kCheckSumFSSuperBlockOffset = 16 * B_PAGE_SIZE;
16static const uint64 kCheckSumFSMinSize
17	= kCheckSumFSSuperBlockOffset + 16 * B_PAGE_SIZE;
18
19
20static const uint32 kCheckSumFSNameLength		= 256;
21
22static const uint32 kCheckSumFSSignatureLength	= 16;
23#define CHECK_SUM_FS_SIGNATURE_1	"_1!cHEcKsUmfS!1_"
24#define CHECK_SUM_FS_SIGNATURE_2	"-2@ChECkSumFs@2-"
25
26static const uint32 kCheckSumFSVersion = 1;
27
28struct checksumfs_super_block {
29	char	signature1[kCheckSumFSSignatureLength];
30	uint32	version;
31	uint32	pad1;
32	uint64	totalBlocks;
33	uint64	freeBlocks;
34	uint64	rootDir;
35	uint64	blockBitmap;
36	char	name[kCheckSumFSNameLength];
37	char	signature2[kCheckSumFSSignatureLength];
38} _PACKED;
39
40
41struct checksumfs_node {
42	uint32	mode;				// node type + permissions
43	uint32	attributeType;		// attribute type (attributes only)
44	uint32	uid;				// owning user ID
45	uint32	gid;				// owning group ID
46	uint64	creationTime;		// in ns since the epoche
47	uint64	modificationTime;	//
48	uint64	changeTime;			//
49	uint64	hardLinks;			// number of references to the node
50	uint64	size;				// content size in bytes
51	uint64	parentDirectory;	// block index of the parent directory
52								// (directories and attributes only)
53	uint64	attributeDirectory;	// block index of the attribute directory (0 if
54								// empty)
55} _PACKED;
56
57
58static const uint32 kCheckSumFSMaxDirEntryTreeDepth		= 24;
59
60struct checksumfs_dir_entry_tree {
61	uint16	depth;
62} _PACKED;
63
64
65struct checksumfs_dir_entry_block {
66	uint16	entryCount;
67	uint16	nameEnds[0];		// end offsets of the names (relative to the
68								// start of the first name),
69								// e.g. nameEnds[0] == length of first name
70	// char	names[];			// string of all (unterminated) names,
71								// directly follows the nameEnds array
72	// ...
73	// uint64	nodes[];
74		// node array ends at the end of the block
75};
76
77
78#endif	// CHECK_SUM_FS_H
79