typedef struct VacFS VacFS; typedef struct VacDir VacDir; typedef struct VacFile VacFile; typedef struct VacDirEnum 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 */ }; 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 */ }; VacFS *vfsOpen(VtSession *z, char *file, int readOnly, long ncache); VacFS *vfsCreate(VtSession *z, int bsize, long ncache); int vfsGetBlockSize(VacFS*); int vfsIsReadOnly(VacFS*); VacFile *vfsGetRoot(VacFS*); long vfsGetCacheSize(VacFS*); int vfsSetCacheSize(VacFS*, long); int vfsSnapshot(VacFS*, char *src, char *dst); int vfsSync(VacFS*); int vfsClose(VacFS*); int vfsGetScore(VacFS*, uchar score[VtScoreSize]); /* * other ideas * * VacFS *vfsSnapshot(VacFS*, char *src); * int vfsGraft(VacFS*, char *name, VacFS*); */ VacFile *vfOpen(VacFS*, char *path); VacFile *vfCreate(VacFile*, char *elem, ulong perm, char *user); VacFile *vfWalk(VacFile*, char *elem); int vfRemove(VacFile*, char*); int vfRead(VacFile*, void *, int n, vlong offset); int vfWrite(VacFile*, void *, int n, vlong offset, char *user); int vfReadPacket(VacFile*, Packet**, vlong offset); int vfWritePacket(VacFile*, Packet*, vlong offset, char *user); uvlong vfGetId(VacFile*); ulong vfGetMcount(VacFile*); int vfIsDir(VacFile*); int vfGetBlockScore(VacFile*, ulong bn, uchar score[VtScoreSize]); int vfGetSize(VacFile*, uvlong *size); int vfGetDir(VacFile*, VacDir*); int vfSetDir(VacFile*, VacDir*); int vfGetVtEntry(VacFile*, VtEntry*); VacFile *vfGetParent(VacFile*); int vfSync(VacFile*); VacFile *vfIncRef(VacFile*); void vfDecRef(VacFile*); VacDirEnum *vfDirEnum(VacFile*); int vfIsRoot(VacFile *vf); void vdCleanup(VacDir *dir); void vdCopy(VacDir *dst, VacDir *src); VacDirEnum *vdeOpen(VacFS*, char *path); int vdeRead(VacDirEnum*, VacDir *, int n); void vdeFree(VacDirEnum*);