xref: /plan9/sys/src/cmd/fossil/vac.h (revision 6042bf6d66dcc60b2e35639f4cefa24e2aa2ecb8)
1 typedef struct DirEntry DirEntry;
2 typedef struct MetaBlock MetaBlock;
3 typedef struct MetaEntry MetaEntry;
4 
5 enum {
6 	MetaMagic = 0x5656fc7a,
7 	MetaHeaderSize = 12,
8 	MetaIndexSize = 4,
9 	IndexEntrySize = 8,
10 	DirMagic = 0x1c4d9072,
11 };
12 
13 /*
14  * Mode bits
15  */
16 enum {
17 	ModeOtherExec = (1<<0),
18 	ModeOtherWrite = (1<<1),
19 	ModeOtherRead = (1<<2),
20 	ModeGroupExec = (1<<3),
21 	ModeGroupWrite = (1<<4),
22 	ModeGroupRead = (1<<5),
23 	ModeOwnerExec = (1<<6),
24 	ModeOwnerWrite = (1<<7),
25 	ModeOwnerRead = (1<<8),
26 	ModeSticky = (1<<9),
27 	ModeSetUid = (1<<10),
28 	ModeSetGid = (1<<11),
29 	ModeAppend = (1<<12),		/* append only file */
30 	ModeExclusive = (1<<13),	/* lock file - plan 9 */
31 	ModeLink = (1<<14),		/* sym link */
32 	ModeDir	= (1<<15),		/* duplicate of DirEntry */
33 	ModeHidden = (1<<16),		/* MS-DOS */
34 	ModeSystem = (1<<17),		/* MS-DOS */
35 	ModeArchive = (1<<18),		/* MS-DOS */
36 	ModeTemporary = (1<<19),	/* MS-DOS */
37 	ModeSnapshot = (1<<20),		/* read only snapshot */
38 };
39 
40 /* optional directory entry fields */
41 enum {
42 	DePlan9 = 1,	/* not valid in version >= 9 */
43 	DeNT,		/* not valid in version >= 9 */
44 	DeQidSpace,
45 	DeGen,		/* not valid in version >= 9 */
46 };
47 
48 struct DirEntry {
49 	char *elem;		/* path element */
50 	ulong entry;		/* entry in directory for data */
51 	ulong gen;		/* generation of data entry */
52 	ulong mentry;		/* entry in directory for meta */
53 	ulong mgen;		/* generation of meta entry */
54 	uvlong size;		/* size of file */
55 	uvlong qid;		/* unique file id */
56 
57 	char *uid;		/* owner id */
58 	char *gid;		/* group id */
59 	char *mid;		/* last modified by */
60 	ulong mtime;		/* last modified time */
61 	ulong mcount;		/* number of modifications: can wrap! */
62 	ulong ctime;		/* directory entry last changed */
63 	ulong atime;		/* last time accessed */
64 	ulong mode;		/* various mode bits */
65 
66 	/* plan 9 */
67 	int plan9;
68 	uvlong p9path;
69 	ulong p9version;
70 
71 	/* sub space of qid */
72 	int qidSpace;
73 	uvlong qidOffset;	/* qid offset */
74 	uvlong qidMax;		/* qid maximum */
75 };
76 
77 struct MetaEntry {
78 	uchar *p;
79 	ushort size;
80 };
81 
82 struct MetaBlock {
83 	int maxsize;		/* size of block */
84 	int size;		/* size used */
85 	int free;		/* free space within used size */
86 	int maxindex;		/* entries allocated for table */
87 	int nindex;		/* amount of table used */
88 	int botch;		/* compensate for my stupidity */
89 	uchar *buf;
90 };
91 
92 void	deCleanup(DirEntry*);
93 void	deCopy(DirEntry*, DirEntry*);
94 int	deSize(DirEntry*);
95 void	dePack(DirEntry*, MetaEntry*);
96 int	deUnpack(DirEntry*, MetaEntry*);
97 
98 void	mbInit(MetaBlock*, uchar*, int, int);
99 int	mbUnpack(MetaBlock*, uchar*, int);
100 void	mbInsert(MetaBlock*, int, MetaEntry*);
101 void	mbDelete(MetaBlock*, int);
102 void	mbPack(MetaBlock*);
103 uchar	*mbAlloc(MetaBlock*, int);
104 int	mbResize(MetaBlock*, MetaEntry*, int);
105 int	mbSearch(MetaBlock*, char*, int*, MetaEntry*);
106 
107 void	meUnpack(MetaEntry*, MetaBlock*, int);
108