typedef struct DirEntry DirEntry; typedef struct MetaBlock MetaBlock; typedef struct MetaEntry MetaEntry; enum { MetaMagic = 0x5656fc7a, MetaHeaderSize = 12, MetaIndexSize = 4, IndexEntrySize = 8, DirMagic = 0x1c4d9072, }; /* * 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 */ }; /* optional directory entry fields */ enum { DePlan9 = 1, /* not valid in version >= 9 */ DeNT, /* not valid in version >= 9 */ DeQidSpace, DeGen, /* not valid in version >= 9 */ }; struct DirEntry { 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 MetaEntry { uchar *p; ushort size; }; struct MetaBlock { int maxsize; /* size of block */ int size; /* size used */ int free; /* free space within used size */ int maxindex; /* entries allocated for table */ int nindex; /* amount of table used */ int botch; /* compensate for my stupidity */ uchar *buf; }; void deCleanup(DirEntry*); void deCopy(DirEntry*, DirEntry*); int deSize(DirEntry*); void dePack(DirEntry*, MetaEntry*); int deUnpack(DirEntry*, MetaEntry*); void mbInit(MetaBlock*, uchar*, int, int); int mbUnpack(MetaBlock*, uchar*, int); void mbInsert(MetaBlock*, int, MetaEntry*); void mbDelete(MetaBlock*, int); void mbPack(MetaBlock*); uchar *mbAlloc(MetaBlock*, int); int mbResize(MetaBlock*, MetaEntry*, int); int mbSearch(MetaBlock*, char*, int*, MetaEntry*); void meUnpack(MetaEntry*, MetaBlock*, int);