1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
typedef struct PaqHeader PaqHeader;
typedef struct PaqBlock PaqBlock;
typedef struct PaqTrailer PaqTrailer;
typedef struct PaqDir PaqDir;
enum {
HeaderMagic = 0x529ab12b,
HeaderSize = 44,
BigHeaderMagic = 0x25a9,
BlockMagic = 0x198a1cbf,
BlockSize = 12,
BigBlockMagic = 0x91a8,
TrailerMagic = 0x6b46e688,
TrailerSize = 28,
Version = 1,
MaxBlockSize = 512*1024,
MinBlockSize = 512,
MinDirSize = 28,
};
/* block types */
enum {
DirBlock,
DataBlock,
PointerBlock,
};
/* encodings */
enum {
NoEnc,
DeflateEnc,
};
struct PaqHeader
{
ulong magic;
ushort version;
ulong blocksize;
ulong time;
char label[32];
};
struct PaqBlock
{
ulong magic;
ulong size; /* data size - always <= blocksize */
uchar type;
uchar encoding;
ulong adler32; /* applied to unencoded data */
};
struct PaqTrailer
{
ulong magic;
ulong root;
uchar sha1[20];
};
struct PaqDir
{
ulong qid;
ulong mode;
ulong mtime;
ulong length;
ulong offset; /* to pointer block */
char *name;
char *uid;
char *gid;
};
|