typedef struct VacFs VacFs; typedef struct VacDir VacDir; typedef struct VacFile VacFile; typedef struct VacDirEnum VacDirEnum; #pragma incomplete VacFile #pragma incomplete VacDirEnum /* * 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, int ncache); VacFs *vacfsopenscore(VtConn *z, u8int *score, int mode, int ncache); VacFs *vacfscreate(VtConn *z, int bsize, int ncache); 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);