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