xref: /plan9/sys/src/cmd/vac/vac.h (revision 3be74836e45a818042257560f5093e4f51d57220)
1 typedef struct VacFs VacFs;
2 typedef struct VacDir VacDir;
3 typedef struct VacFile VacFile;
4 typedef struct VacDirEnum VacDirEnum;
5 
6 #pragma incomplete VacFile
7 #pragma incomplete VacDirEnum
8 
9 /*
10  * Mode bits
11  */
12 enum
13 {
14 	ModeOtherExec = (1<<0),
15 	ModeOtherWrite = (1<<1),
16 	ModeOtherRead = (1<<2),
17 	ModeGroupExec = (1<<3),
18 	ModeGroupWrite = (1<<4),
19 	ModeGroupRead = (1<<5),
20 	ModeOwnerExec = (1<<6),
21 	ModeOwnerWrite = (1<<7),
22 	ModeOwnerRead = (1<<8),
23 	ModeSticky = (1<<9),
24 	ModeSetUid = (1<<10),
25 	ModeSetGid = (1<<11),
26 	ModeAppend = (1<<12),		/* append only file */
27 	ModeExclusive = (1<<13),	/* lock file - plan 9 */
28 	ModeLink = (1<<14),		/* sym link */
29 	ModeDir	= (1<<15),		/* duplicate of DirEntry */
30 	ModeHidden = (1<<16),		/* MS-DOS */
31 	ModeSystem = (1<<17),		/* MS-DOS */
32 	ModeArchive = (1<<18),		/* MS-DOS */
33 	ModeTemporary = (1<<19),	/* MS-DOS */
34 	ModeSnapshot = (1<<20),		/* read only snapshot */
35 	ModeDevice = (1<<21),		/* Unix device */
36 	ModeNamedPipe = (1<<22)	/* Unix named pipe */
37 };
38 
39 enum
40 {
41 	MetaMagic = 0x5656fc79,
42 	MetaHeaderSize = 12,
43 	MetaIndexSize = 4,
44 	IndexEntrySize = 8,
45 	DirMagic = 0x1c4d9072
46 };
47 
48 enum
49 {
50 	DirPlan9Entry = 1,	/* not valid in version >= 9 */
51 	DirNTEntry,		/* not valid in version >= 9 */
52 	DirQidSpaceEntry,
53 	DirGenEntry		/* not valid in version >= 9 */
54 };
55 
56 struct VacDir
57 {
58 	char *elem;		/* path element */
59 	ulong entry;		/* entry in directory for data */
60 	ulong gen;		/* generation of data entry */
61 	ulong mentry;		/* entry in directory for meta */
62 	ulong mgen;		/* generation of meta entry */
63 	uvlong size;		/* size of file */
64 	uvlong qid;		/* unique file id */
65 
66 	char *uid;		/* owner id */
67 	char *gid;		/* group id */
68 	char *mid;		/* last modified by */
69 	ulong mtime;		/* last modified time */
70 	ulong mcount;		/* number of modifications: can wrap! */
71 	ulong ctime;		/* directory entry last changed */
72 	ulong atime;		/* last time accessed */
73 	ulong mode;		/* various mode bits */
74 
75 	/* plan 9 */
76 	int plan9;
77 	uvlong p9path;
78 	ulong p9version;
79 
80 	/* sub space of qid */
81 	int qidspace;
82 	uvlong qidoffset;	/* qid offset */
83 	uvlong qidmax;		/* qid maximum */
84 };
85 
86 struct VacFs
87 {
88 	char	name[128];
89 	uchar	score[VtScoreSize];
90 	VacFile	*root;
91 	VtConn	*z;
92 	int		mode;
93 	int		bsize;
94 	uvlong	qid;
95 	VtCache	*cache;
96 };
97 
98 VacFs	*vacfsopen(VtConn *z, char *file, int mode, int ncache);
99 VacFs	*vacfsopenscore(VtConn *z, u8int *score, int mode, int ncache);
100 VacFs	*vacfscreate(VtConn *z, int bsize, int ncache);
101 void		vacfsclose(VacFs *fs);
102 int		vacfssync(VacFs *fs);
103 int		vacfssnapshot(VacFs *fs, char *src, char *dst);
104 int		vacfsgetscore(VacFs *fs, u8int *score);
105 int		vacfsgetmaxqid(VacFs*, uvlong*);
106 void		vacfsjumpqid(VacFs*, uvlong);
107 
108 VacFile *vacfsgetroot(VacFs *fs);
109 VacFile	*vacfileopen(VacFs *fs, char *path);
110 VacFile	*vacfilecreate(VacFile *file, char *elem, ulong perm);
111 VacFile	*vacfilewalk(VacFile *file, char *elem);
112 int		vacfileremove(VacFile *file);
113 int		vacfileread(VacFile *file, void *buf, int n, vlong offset);
114 int		vacfileblockscore(VacFile *file, u32int, u8int*);
115 int		vacfilewrite(VacFile *file, void *buf, int n, vlong offset);
116 uvlong	vacfilegetid(VacFile *file);
117 ulong	vacfilegetmcount(VacFile *file);
118 int		vacfileisdir(VacFile *file);
119 int		vacfileisroot(VacFile *file);
120 ulong	vacfilegetmode(VacFile *file);
121 int		vacfilegetsize(VacFile *file, uvlong *size);
122 int		vacfilegetdir(VacFile *file, VacDir *dir);
123 int		vacfilesetdir(VacFile *file, VacDir *dir);
124 VacFile	*vacfilegetparent(VacFile *file);
125 int		vacfileflush(VacFile*, int);
126 VacFile	*vacfileincref(VacFile*);
127 int		vacfiledecref(VacFile*);
128 int		vacfilesetsize(VacFile *f, uvlong size);
129 
130 int		vacfilegetentries(VacFile *f, VtEntry *e, VtEntry *me);
131 int		vacfilesetentries(VacFile *f, VtEntry *e, VtEntry *me);
132 
133 void		vdcleanup(VacDir *dir);
134 void		vdcopy(VacDir *dst, VacDir *src);
135 int		vacfilesetqidspace(VacFile*, u64int, u64int);
136 uvlong	vacfilegetqidoffset(VacFile*);
137 
138 VacDirEnum	*vdeopen(VacFile*);
139 int			vderead(VacDirEnum*, VacDir *);
140 void			vdeclose(VacDirEnum*);
141 int	vdeunread(VacDirEnum*);
142 
143 int	vacfiledsize(VacFile *f);
144 int	sha1matches(VacFile *f, ulong b, uchar *buf, int n);
145 
146