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