| typedef struct VacFs VacFs; | 
 | typedef struct VacDir VacDir; | 
 | typedef struct VacFile VacFile; | 
 | typedef struct VacDirEnum VacDirEnum; | 
 |  | 
 | #ifndef PLAN9PORT | 
 | #pragma incomplete VacFile | 
 | #pragma incomplete VacDirEnum | 
 | #endif | 
 |  | 
 | /* | 
 |  * Mode bits | 
 |  */ | 
 | enum | 
 | { | 
 | 	ModeOtherExec = (1<<0),		 | 
 | 	ModeOtherWrite = (1<<1), | 
 | 	ModeOtherRead = (1<<2), | 
 | 	ModeGroupExec = (1<<3), | 
 | 	ModeGroupWrite = (1<<4), | 
 | 	ModeGroupRead = (1<<5), | 
 | 	ModeOwnerExec = (1<<6), | 
 | 	ModeOwnerWrite = (1<<7), | 
 | 	ModeOwnerRead = (1<<8), | 
 | 	ModeSticky = (1<<9), | 
 | 	ModeSetUid = (1<<10), | 
 | 	ModeSetGid = (1<<11), | 
 | 	ModeAppend = (1<<12),		/* append only file */ | 
 | 	ModeExclusive = (1<<13),	/* lock file - plan 9 */ | 
 | 	ModeLink = (1<<14),		/* sym link */ | 
 | 	ModeDir	= (1<<15),		/* duplicate of DirEntry */ | 
 | 	ModeHidden = (1<<16),		/* MS-DOS */ | 
 | 	ModeSystem = (1<<17),		/* MS-DOS */ | 
 | 	ModeArchive = (1<<18),		/* MS-DOS */ | 
 | 	ModeTemporary = (1<<19),	/* MS-DOS */ | 
 | 	ModeSnapshot = (1<<20),		/* read only snapshot */ | 
 | 	ModeDevice = (1<<21),		/* Unix device */ | 
 | 	ModeNamedPipe = (1<<22)	/* Unix named pipe */ | 
 | }; | 
 |  | 
 | enum | 
 | { | 
 | 	MetaMagic = 0x5656fc79, | 
 | 	MetaHeaderSize = 12, | 
 | 	MetaIndexSize = 4, | 
 | 	IndexEntrySize = 8, | 
 | 	DirMagic = 0x1c4d9072 | 
 | }; | 
 |  | 
 | enum | 
 | { | 
 | 	DirPlan9Entry = 1,	/* not valid in version >= 9 */ | 
 | 	DirNTEntry,		/* not valid in version >= 9 */ | 
 | 	DirQidSpaceEntry, | 
 | 	DirGenEntry		/* not valid in version >= 9 */ | 
 | }; | 
 |  | 
 | struct VacDir | 
 | { | 
 | 	char *elem;		/* path element */ | 
 | 	ulong entry;		/* entry in directory for data */ | 
 | 	ulong gen;		/* generation of data entry */ | 
 | 	ulong mentry;		/* entry in directory for meta */ | 
 | 	ulong mgen;		/* generation of meta entry */ | 
 | 	uvlong size;		/* size of file */ | 
 | 	uvlong qid;		/* unique file id */ | 
 | 	 | 
 | 	char *uid;		/* owner id */ | 
 | 	char *gid;		/* group id */ | 
 | 	char *mid;		/* last modified by */ | 
 | 	ulong mtime;		/* last modified time */ | 
 | 	ulong mcount;		/* number of modifications: can wrap! */ | 
 | 	ulong ctime;		/* directory entry last changed */ | 
 | 	ulong atime;		/* last time accessed */ | 
 | 	ulong mode;		/* various mode bits */ | 
 |  | 
 | 	/* plan 9 */ | 
 | 	int plan9; | 
 | 	uvlong p9path; | 
 | 	ulong p9version; | 
 |  | 
 | 	/* sub space of qid */ | 
 | 	int qidspace; | 
 | 	uvlong qidoffset;	/* qid offset */ | 
 | 	uvlong qidmax;		/* qid maximum */ | 
 | }; | 
 |  | 
 | struct VacFs | 
 | { | 
 | 	char	name[128]; | 
 | 	uchar	score[VtScoreSize]; | 
 | 	VacFile	*root; | 
 | 	VtConn	*z; | 
 | 	int		mode; | 
 | 	int		bsize; | 
 | 	uvlong	qid; | 
 | 	VtCache	*cache; | 
 | }; | 
 |  | 
 | VacFs	*vacfsopen(VtConn *z, char *file, int mode, ulong cachemem); | 
 | VacFs	*vacfsopenscore(VtConn *z, u8int *score, int mode, ulong cachemem); | 
 | VacFs	*vacfscreate(VtConn *z, int bsize, ulong cachemem); | 
 | void		vacfsclose(VacFs *fs); | 
 | int		vacfssync(VacFs *fs); | 
 | int		vacfssnapshot(VacFs *fs, char *src, char *dst); | 
 | int		vacfsgetscore(VacFs *fs, u8int *score); | 
 | int		vacfsgetmaxqid(VacFs*, uvlong*); | 
 | void		vacfsjumpqid(VacFs*, uvlong); | 
 |  | 
 | VacFile *vacfsgetroot(VacFs *fs); | 
 | VacFile	*vacfileopen(VacFs *fs, char *path); | 
 | VacFile	*vacfilecreate(VacFile *file, char *elem, ulong perm); | 
 | VacFile	*vacfilewalk(VacFile *file, char *elem); | 
 | int		vacfileremove(VacFile *file); | 
 | int		vacfileread(VacFile *file, void *buf, int n, vlong offset); | 
 | int		vacfileblockscore(VacFile *file, u32int, u8int*); | 
 | int		vacfilewrite(VacFile *file, void *buf, int n, vlong offset); | 
 | uvlong	vacfilegetid(VacFile *file); | 
 | ulong	vacfilegetmcount(VacFile *file); | 
 | int		vacfileisdir(VacFile *file); | 
 | int		vacfileisroot(VacFile *file); | 
 | ulong	vacfilegetmode(VacFile *file); | 
 | int		vacfilegetsize(VacFile *file, uvlong *size); | 
 | int		vacfilegetdir(VacFile *file, VacDir *dir); | 
 | int		vacfilesetdir(VacFile *file, VacDir *dir); | 
 | VacFile	*vacfilegetparent(VacFile *file); | 
 | int		vacfileflush(VacFile*, int); | 
 | VacFile	*vacfileincref(VacFile*); | 
 | int		vacfiledecref(VacFile*); | 
 | int		vacfilesetsize(VacFile *f, uvlong size); | 
 |  | 
 | int		vacfilegetentries(VacFile *f, VtEntry *e, VtEntry *me); | 
 | int		vacfilesetentries(VacFile *f, VtEntry *e, VtEntry *me); | 
 |  | 
 | void		vdcleanup(VacDir *dir); | 
 | void		vdcopy(VacDir *dst, VacDir *src); | 
 | int		vacfilesetqidspace(VacFile*, u64int, u64int); | 
 | uvlong	vacfilegetqidoffset(VacFile*); | 
 |  | 
 | VacDirEnum	*vdeopen(VacFile*); | 
 | int			vderead(VacDirEnum*, VacDir *); | 
 | void			vdeclose(VacDirEnum*); | 
 | int	vdeunread(VacDirEnum*); | 
 |  | 
 | int	vacfiledsize(VacFile *f); | 
 | int	sha1matches(VacFile *f, ulong b, uchar *buf, int n); | 
 |  |