|  | 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); | 
|  |  |