19a747e4fSDavid du Colombier typedef struct PaqHeader PaqHeader; 29a747e4fSDavid du Colombier typedef struct PaqBlock PaqBlock; 39a747e4fSDavid du Colombier typedef struct PaqTrailer PaqTrailer; 49a747e4fSDavid du Colombier typedef struct PaqDir PaqDir; 59a747e4fSDavid du Colombier 69a747e4fSDavid du Colombier enum { 79a747e4fSDavid du Colombier HeaderMagic = 0x529ab12b, 89a747e4fSDavid du Colombier HeaderSize = 44, 9*fe853e23SDavid du Colombier BigHeaderMagic = 0x25a9, 109a747e4fSDavid du Colombier BlockMagic = 0x198a1cbf, 119a747e4fSDavid du Colombier BlockSize = 12, 12*fe853e23SDavid du Colombier BigBlockMagic = 0x91a8, 139a747e4fSDavid du Colombier TrailerMagic = 0x6b46e688, 149a747e4fSDavid du Colombier TrailerSize = 28, 159a747e4fSDavid du Colombier Version = 1, 16*fe853e23SDavid du Colombier MaxBlockSize = 512*1024, 179a747e4fSDavid du Colombier MinBlockSize = 512, 189a747e4fSDavid du Colombier MinDirSize = 28, 199a747e4fSDavid du Colombier }; 209a747e4fSDavid du Colombier 219a747e4fSDavid du Colombier /* block types */ 229a747e4fSDavid du Colombier enum { 239a747e4fSDavid du Colombier DirBlock, 249a747e4fSDavid du Colombier DataBlock, 259a747e4fSDavid du Colombier PointerBlock, 269a747e4fSDavid du Colombier }; 279a747e4fSDavid du Colombier 289a747e4fSDavid du Colombier /* encodings */ 299a747e4fSDavid du Colombier enum { 309a747e4fSDavid du Colombier NoEnc, 319a747e4fSDavid du Colombier DeflateEnc, 329a747e4fSDavid du Colombier }; 339a747e4fSDavid du Colombier 349a747e4fSDavid du Colombier struct PaqHeader 359a747e4fSDavid du Colombier { 369a747e4fSDavid du Colombier ulong magic; 379a747e4fSDavid du Colombier ushort version; 38*fe853e23SDavid du Colombier ulong blocksize; 399a747e4fSDavid du Colombier ulong time; 409a747e4fSDavid du Colombier char label[32]; 419a747e4fSDavid du Colombier }; 429a747e4fSDavid du Colombier 439a747e4fSDavid du Colombier struct PaqBlock 449a747e4fSDavid du Colombier { 459a747e4fSDavid du Colombier ulong magic; 46*fe853e23SDavid du Colombier ulong size; /* data size - always <= blocksize */ 479a747e4fSDavid du Colombier uchar type; 489a747e4fSDavid du Colombier uchar encoding; 499a747e4fSDavid du Colombier ulong adler32; /* applied to unencoded data */ 509a747e4fSDavid du Colombier }; 519a747e4fSDavid du Colombier 529a747e4fSDavid du Colombier struct PaqTrailer 539a747e4fSDavid du Colombier { 549a747e4fSDavid du Colombier ulong magic; 559a747e4fSDavid du Colombier ulong root; 569a747e4fSDavid du Colombier uchar sha1[20]; 579a747e4fSDavid du Colombier }; 589a747e4fSDavid du Colombier 599a747e4fSDavid du Colombier struct PaqDir 609a747e4fSDavid du Colombier { 619a747e4fSDavid du Colombier ulong qid; 629a747e4fSDavid du Colombier ulong mode; 639a747e4fSDavid du Colombier ulong mtime; 649a747e4fSDavid du Colombier ulong length; 659a747e4fSDavid du Colombier ulong offset; /* to pointer block */ 669a747e4fSDavid du Colombier char *name; 679a747e4fSDavid du Colombier char *uid; 689a747e4fSDavid du Colombier char *gid; 699a747e4fSDavid du Colombier }; 70